2 * Copyright (c) 1999 Hellmuth Michaelis
4 * Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch.
6 * Copyright (c) 1992, 1993 Brian Dunford-Shore and Holger Veit.
10 * This code is derived from software contributed to Berkeley by
11 * William Jolitz and Don Ahn.
13 * This code is derived from software contributed to 386BSD by
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
19 * 1. Redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer.
21 * 2. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution.
24 * 3. All advertising materials mentioning features or use of this software
25 * must display the following acknowledgement:
26 * This product includes software developed by Hellmuth Michaelis,
27 * Brian Dunford-Shore and Joerg Wunsch.
28 * 4. The name authors may not be used to endorse or promote products
29 * derived from this software without specific prior written permission.
31 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
32 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
34 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
35 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
37 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
38 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
39 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
40 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 /*---------------------------------------------------------------------------*
45 * pcvt_kbd.c VT220 Driver Keyboard Interface Code
46 * ----------------------------------------------------
48 * Last Edit-Date: [Mon Dec 27 14:01:50 1999]
50 * $FreeBSD: src/sys/i386/isa/pcvt/pcvt_kbd.c,v 1.32.2.1 2000/10/29 16:59:28 dwmalone Exp $
51 * $DragonFly: src/sys/dev/video/pcvt/i386/Attic/pcvt_kbd.c,v 1.7 2004/09/18 20:23:04 dillon Exp $
53 *---------------------------------------------------------------------------*/
60 #include "pcvt_hdr.h" /* global include */
62 #define LEDSTATE_UPDATE_PENDING (1 << 3)
64 static void fkey1(void), fkey2(void), fkey3(void), fkey4(void);
65 static void fkey5(void), fkey6(void), fkey7(void), fkey8(void);
66 static void fkey9(void), fkey10(void), fkey11(void), fkey12(void);
68 static void sfkey1(void), sfkey2(void), sfkey3(void), sfkey4(void);
69 static void sfkey5(void), sfkey6(void), sfkey7(void), sfkey8(void);
70 static void sfkey9(void), sfkey10(void), sfkey11(void), sfkey12(void);
72 static void cfkey1(void), cfkey2(void), cfkey3(void), cfkey4(void);
73 static void cfkey5(void), cfkey6(void), cfkey7(void), cfkey8(void);
74 static void cfkey9(void), cfkey10(void), cfkey11(void), cfkey12(void);
76 static void doreset ( void );
77 static void ovlinit ( int force );
78 static void settpmrate ( int rate );
79 static void setlockkeys ( int snc );
80 #ifndef _DEV_KBD_KBDREG_H_
81 static int kbc_8042cmd ( int val );
82 #endif /* !_DEV_KBD_KBDREG_H_ */
83 static int getokeydef ( unsigned key, struct kbd_ovlkey *thisdef );
84 static int getckeydef ( unsigned key, struct kbd_ovlkey *thisdef );
85 static int rmkeydef ( int key );
86 static int setkeydef ( struct kbd_ovlkey *data );
87 static u_char * xlatkey2ascii( U_short key );
89 static int ledstate = LEDSTATE_UPDATE_PENDING; /* keyboard led's */
90 static int tpmrate = KBD_TPD500|KBD_TPM100;
91 static u_char altkpflag = 0;
92 static u_short altkpval = 0;
94 static u_short *scrollback_savedscreen = (u_short *)0;
95 static size_t scrnsv_size = (size_t)-1;
96 static void scrollback_save_screen ( void );
97 static void scrollback_restore_screen ( void );
100 u_char rawkeybuf[80];
103 #include "pcvt_kbd.h" /* tables etc */
106 /*---------------------------------------------------------------------------*
107 * keyboard debugging: put kbd communication char into some buffer
108 *---------------------------------------------------------------------------*/
109 static void showkey (char delim, u_char val)
113 for(rki = 3; rki < 80; rki++) /* shift left buffer */
114 rawkeybuf[rki-3] = rawkeybuf[rki];
116 rawkeybuf[77] = delim; /* delimiter */
118 rki = (val & 0xf0) >> 4; /* ms nibble */
123 rki = rki - 10 + 'A';
127 rki = val & 0x0f; /* ls nibble */
132 rki = rki - 10 + 'A';
136 #endif /* PCVT_SHOWKEYS */
138 /*---------------------------------------------------------------------------*
139 * function to switch to another virtual screen
140 *---------------------------------------------------------------------------*/
144 if(critical_scroll) /* executing critical region ? */
145 switch_page = page; /* yes, auto switch later */
147 vgapage(page); /* no, switch now */
152 * This code from Lon Willett enclosed in #if PCVT_UPDLED_LOSES_INTR is
153 * abled because it crashes FreeBSD 1.1.5.1 at boot time.
154 * The cause is obviously that the timeout queue is not yet initialized
155 * timeout is called from here the first time.
156 * Anyway it is a pointer in the right direction so it is included for
160 #define PCVT_UPDLED_LOSES_INTR 0 /* disabled for now */
162 #if PCVT_UPDLED_LOSES_INTR || defined(_DEV_KBD_KBDREG_H_)
164 /*---------------------------------------------------------------------------*
165 * check for lost keyboard interrupts
166 *---------------------------------------------------------------------------*/
169 * The two commands to change the LEDs generate two KEYB_R_ACK responses
170 * from the keyboard, which aren't explicitly checked for (maybe they
171 * should be?). However, when a lot of other I/O is happening, one of
172 * the interrupts sometimes gets lost (I'm not sure of the details of
173 * how and why and what hardware this happens with).
175 * This may have had something to do with spltty() previously not being
176 * called before the kbd_cmd() calls in update_led().
178 * This is a real problem, because normally the keyboard is only polled
179 * by pcrint(), and no more interrupts will be generated until the ACK
180 * has been read. So the keyboard is hung. This code polls a little
181 * while after changing the LEDs to make sure that this hasn't happened.
183 * XXX Quite possibly we should poll the kbd on a regular basis anyway,
184 * in the interest of robustness. It may be possible that interrupts
185 * get lost other times as well.
188 static int lost_intr_timeout_queued = 0;
189 static struct callout lost_intr_ch;
192 check_for_lost_intr (void *arg)
194 #ifndef _DEV_KBD_KBDREG_H_
195 lost_intr_timeout_queued = 0;
196 if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)
198 int opri = spltty ();
205 lost_intr_timeout_queued = 0;
206 if (kbd && (*kbdsw[kbd->kb_index]->lock)(kbd, TRUE)) {
208 (*kbdsw[kbd->kb_index]->lock)(kbd, FALSE);
209 if ((*kbdsw[kbd->kb_index]->check)(kbd))
213 if ((lost_intr_ch.c_flags & CALLOUT_DID_INIT) == 0)
214 callout_init(&lost_intr_ch);
215 callout_reset(&lost_intr_ch, hz, check_for_lost_intr, NULL);
216 lost_intr_timeout_queued = 1;
217 #endif /* !_DEV_KBD_KBDREG_H_ */
220 #endif /* PCVT_UPDLED_LOSES_INTR || defined(_DEV_KBD_KBDREG_H_) */
222 /*---------------------------------------------------------------------------*
223 * update keyboard led's
224 *---------------------------------------------------------------------------*/
228 #if !PCVT_NO_LED_UPDATE
230 /* Don't update LED's unless necessary. */
232 int opri, new_ledstate;
235 #ifndef _DEV_KBD_KBDREG_H_
236 new_ledstate = (vsp->scroll_lock) |
237 (vsp->num_lock * 2) |
238 (vsp->caps_lock * 4);
240 new_ledstate = ((vsp->scroll_lock) ? LED_SCR : 0) |
241 ((vsp->num_lock) ? LED_NUM : 0) |
242 ((vsp->caps_lock) ? LED_CAP : 0);
243 #endif /* _DEV_KBD_KBDREG_H_ */
245 if (new_ledstate != ledstate)
247 #ifndef _DEV_KBD_KBDREG_H_
248 int response1, response2;
250 ledstate = LEDSTATE_UPDATE_PENDING;
252 if(kbd_cmd(KEYB_C_LEDS) != 0)
254 printf("Keyboard LED command timeout\n");
260 * For some keyboards or keyboard controllers, it is an
261 * error to issue a command without waiting long enough
262 * for an ACK for the previous command. The keyboard
263 * gets confused, and responds with KEYB_R_RESEND, but
264 * we ignore that. Wait for the ACK here. The busy
265 * waiting doesn't matter much, since we lose anyway by
266 * busy waiting to send the command.
268 * XXX actually wait for any response, since we can't
269 * handle normal scancodes here.
271 * XXX all this should be interrupt driven. Issue only
272 * one command at a time wait for a ACK before proceeding.
273 * Retry after a timeout or on receipt of a KEYB_R_RESEND.
274 * KEYB_R_RESENDs seem to be guaranteed by working
275 * keyboard controllers with broken (or disconnected)
276 * keyboards. There is another code for keyboard
277 * reconnects. The keyboard hardware is very simple and
280 response1 = kbd_response();
282 if(kbd_cmd(new_ledstate) != 0) {
283 printf("Keyboard LED data timeout\n");
287 response2 = kbd_response();
289 if (response1 == KEYB_R_ACK && response2 == KEYB_R_ACK)
290 ledstate = new_ledstate;
293 "Keyboard LED command not ACKed (responses %#x %#x)\n",
294 response1, response2);
295 #else /* _DEV_KBD_KBDREG_H_ */
298 ledstate = new_ledstate;
301 ledstate = LEDSTATE_UPDATE_PENDING;
303 if ((*kbdsw[kbd->kb_index]->ioctl)(kbd, KDSETLED,
304 (caddr_t)&new_ledstate) == 0)
305 ledstate = new_ledstate;
308 #endif /* !_DEV_KBD_KBDREG_H_ */
310 #if PCVT_UPDLED_LOSES_INTR
311 if ((lost_intr_ch.c_flags & CALLOUT_DID_INIT) == 0)
312 callout_init(&lost_intr_ch);
313 callout_reset(&lost_intr_ch, hz, check_for_lost_intr, NULL);
314 lost_intr_timeout_queued = 1;
315 #endif /* PCVT_UPDLED_LOSES_INTR */
319 #ifndef _DEV_KBD_KBDREG_H_
323 #endif /* !PCVT_NO_LED_UPDATE */
326 /*---------------------------------------------------------------------------*
328 *---------------------------------------------------------------------------*/
332 #ifndef _DEV_KBD_KBDREG_H_
333 tpmrate = rate & 0x7f;
334 if(kbd_cmd(KEYB_C_TYPEM) != 0)
335 printf("Keyboard TYPEMATIC command timeout\n");
336 else if(kbd_cmd(tpmrate) != 0)
337 printf("Keyboard TYPEMATIC data timeout\n");
341 tpmrate = rate & 0x7f;
342 if ((*kbdsw[kbd->kb_index]->ioctl)(kbd, KDSETRAD, (caddr_t)&tpmrate))
343 printf("pcvt: failed to set keyboard TYPEMATIC.\n");
344 #endif /* !_DEV_KBD_KBDREG_H_ */
347 #ifndef _DEV_KBD_KBDREG_H_
348 /*---------------------------------------------------------------------------*
349 * Pass command to keyboard controller (8042)
350 *---------------------------------------------------------------------------*/
356 timeo = 100000; /* > 100 msec */
357 while (inb(CONTROLLER_CTRL) & STATUS_INPBF)
360 outb(CONTROLLER_CTRL, val);
364 /*---------------------------------------------------------------------------*
365 * Pass command to keyboard itself
366 *---------------------------------------------------------------------------*/
372 timeo = 100000; /* > 100 msec */
373 while (inb(CONTROLLER_CTRL) & STATUS_INPBF)
376 outb(CONTROLLER_DATA, val);
380 #endif /* PCVT_SHOWKEYS */
385 /*---------------------------------------------------------------------------*
386 * Read response from keyboard
387 * NB: make sure to call spltty() before kbd_cmd(), kbd_response().
388 *---------------------------------------------------------------------------*/
395 timeo = 500000; /* > 500 msec (KEYB_R_SELFOK requires 87) */
396 while (!(inb(CONTROLLER_CTRL) & STATUS_OUTPBF))
400 PCVT_KBD_DELAY(); /* 7 us delay */
401 ch = inb(CONTROLLER_DATA);
405 #endif /* PCVT_SHOWKEYS */
409 #endif /* _DEV_KBD_KBDREG_H_ */
412 /*---------------------------------------------------------------------------*
413 * switch PC scan code emulation mode
414 *---------------------------------------------------------------------------*/
416 kbd_emulate_pc(int do_emulation)
418 #ifndef _DEV_KBD_KBDREG_H_
419 int cmd, timeo = 10000;
421 cmd = COMMAND_SYSFLG|COMMAND_IRQEN; /* common base cmd */
424 cmd |= COMMAND_INHOVR;
428 cmd |= COMMAND_PCSCAN;
430 kbc_8042cmd(CONTR_WRITE);
431 while (inb(CONTROLLER_CTRL) & STATUS_INPBF)
434 outb(CONTROLLER_DATA, cmd);
436 set_controller_command_byte(*(KBDC *)kbd->kb_data, KBD_TRANSLATION,
437 (do_emulation) ? KBD_TRANSLATION : 0);
438 #endif /* !_DEV_KBD_KBDREG_H_ */
441 #endif /* PCVT_SCANSET > 1 */
444 #ifndef PCVT_NONRESP_KEYB_TRY
445 #define PCVT_NONRESP_KEYB_TRY 25 /* no of times to try to detect */
446 #endif /* a nonresponding keyboard */
448 /*---------------------------------------------------------------------------*
449 * try to force keyboard into a known state ..
450 *---------------------------------------------------------------------------*/
454 #ifndef _DEV_KBD_KBDREG_H_
459 /* Enable interrupts and keyboard, etc. */
460 if (kbc_8042cmd(CONTR_WRITE) != 0)
461 printf("pcvt: doreset() - timeout controller write command\n");
463 #if PCVT_USEKBDSEC /* security enabled */
465 # if PCVT_SCANSET == 2
466 # define KBDINITCMD COMMAND_SYSFLG|COMMAND_IRQEN
467 # else /* PCVT_SCANSET != 2 */
468 # define KBDINITCMD COMMAND_PCSCAN|COMMAND_SYSFLG|COMMAND_IRQEN
469 # endif /* PCVT_SCANSET == 2 */
471 #else /* ! PCVT_USEKBDSEC */ /* security disabled */
473 # if PCVT_SCANSET == 2
474 # define KBDINITCMD COMMAND_INHOVR|COMMAND_SYSFLG|COMMAND_IRQEN
475 # else /* PCVT_SCANSET != 2 */
476 # define KBDINITCMD COMMAND_PCSCAN|COMMAND_INHOVR|COMMAND_SYSFLG\
478 # endif /* PCVT_SCANSET == 2 */
480 #endif /* PCVT_USEKBDSEC */
482 if (kbd_cmd(KBDINITCMD) != 0)
483 printf("pcvt: doreset() - timeout writing keyboard init command\n");
486 * Discard any stale keyboard activity. The 0.1 boot code isn't
487 * very careful and sometimes leaves a KEYB_R_RESEND. Versions
488 * between 1992 and Oct 1996 didn't have the delay and sometimes
489 * left a KEYB_R_RESEND.
492 if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)
496 if (!(inb(CONTROLLER_CTRL) & STATUS_OUTPBF))
501 /* Start keyboard reset */
505 if (kbd_cmd(KEYB_C_RESET) != 0)
507 printf("pcvt: doreset() - timeout for keyboard reset command\n");
508 outb(CONTROLLER_DATA, KEYB_C_RESET); /* force */
511 /* Wait for the first response to reset and handle retries */
512 while ((response = kbd_response()) != KEYB_R_ACK)
516 if(!again) /* print message only once ! */
517 printf("pcvt: doreset() - response != ack and response < 0 [one time only msg]\n");
518 response = KEYB_R_RESEND;
520 else if (response == KEYB_R_RESEND)
522 if(!again) /* print message only once ! */
523 printf("pcvt: doreset() - got KEYB_R_RESEND response ... [one time only msg]\n");
525 if (response == KEYB_R_RESEND)
527 if(++again > PCVT_NONRESP_KEYB_TRY)
529 printf("pcvt: doreset() - Caution - no PC keyboard detected!\n");
530 keyboard_type = KB_UNKNOWN;
535 if((kbd_cmd(KEYB_C_RESET) != 0) && (once == 0))
537 once++; /* print message only once ! */
538 printf("pcvt: doreset() - timeout for loop keyboard reset command [one time only msg]\n");
539 outb(CONTROLLER_DATA, KEYB_C_RESET); /* force */
544 /* Wait for the second response to reset */
546 while ((response = kbd_response()) != KEYB_R_SELFOK)
550 printf("pcvt: doreset() - response != OK and resonse < 0\n");
552 * If KEYB_R_SELFOK never arrives, the loop will
553 * finish here unless the keyboard babbles or
554 * STATUS_OUTPBF gets stuck.
566 if(kbd_cmd(KEYB_C_ID) != 0)
568 printf("pcvt: doreset() - timeout for keyboard ID command\n");
569 keyboard_type = KB_UNKNOWN;
576 if((response = kbd_response()) == KEYB_R_MF2ID1)
578 if((response = kbd_response()) == KEYB_R_MF2ID2)
580 keyboard_type = KB_MFII;
582 else if(response == KEYB_R_MF2ID2HP)
584 keyboard_type = KB_MFII;
588 printf("\npcvt: doreset() - kbdid, response 2 = [%d]\n",
590 keyboard_type = KB_UNKNOWN;
593 else if (response == KEYB_R_ACK)
597 else if (response == -1)
599 keyboard_type = KB_AT;
603 printf("\npcvt: doreset() - kbdid, response 1 = [%d]\n", response);
609 #else /* PCVT_KEYBDID */
611 keyboard_type = KB_MFII; /* force it .. */
613 #endif /* PCVT_KEYBDID */
615 #else /* _DEV_KBD_KBDREG_H_ */
618 if (!reset_keyboard) /* no, we are not ready to reset */
621 if (lost_intr_timeout_queued) {
622 callout_stop(&lost_intr_ch);
623 lost_intr_timeout_queued = 0;
627 return; /* shouldn't happen */
630 ledstate = LEDSTATE_UPDATE_PENDING;
632 #if PCVT_USEKBDSEC /* security enabled */
634 # if PCVT_SCANSET == 2
635 # define KBDINITCMD 0
636 # else /* PCVT_SCANSET != 2 */
637 # define KBDINITCMD KBD_TRANSLATION
638 # endif /* PCVT_SCANSET == 2 */
640 #else /* ! PCVT_USEKBDSEC */ /* security disabled */
642 # if PCVT_SCANSET == 2
643 # define KBDINITCMD KBD_OVERRIDE_KBD_LOCK
644 # else /* PCVT_SCANSET != 2 */
645 # define KBDINITCMD KBD_TRANSLATION | KBD_OVERRIDE_KBD_LOCK
646 # endif /* PCVT_SCANSET == 2 */
648 #endif /* PCVT_USEKBDSEC */
650 set_controller_command_byte(*(KBDC *)kbd->kb_data,
651 KBD_OVERRIDE_KBD_LOCK | KBD_TRANSLATION, KBDINITCMD);
653 keyboard_type = KB_MFII; /* force it .. */
656 (*kbdsw[kbd->kb_index]->ioctl)(kbd, KDGKBTYPE, (caddr_t)&type);
660 keyboard_type = KB_AT;
663 keyboard_type = KB_MFII;
666 keyboard_type = KB_UNKNOWN;
669 #endif /* PCVT_KEYBDID */
673 if ((lost_intr_ch.c_flags & CALLOUT_DID_INIT) == 0)
674 callout_init(&lost_intr_ch);
675 callout_reset(&lost_intr_ch, hz, check_for_lost_intr, NULL);
676 lost_intr_timeout_queued = 1;
678 #endif /* !_DEV_KBD_KBDREG_H_ */
681 /*---------------------------------------------------------------------------*
683 *---------------------------------------------------------------------------*/
689 keyboard_is_initialized = 1;
692 /*---------------------------------------------------------------------------*
693 * init keyboard code, this initializes the keyboard subsystem
694 * just "a bit" so the very very first ddb session is able to
695 * get proper keystrokes - in other words, it's a hack ....
696 *---------------------------------------------------------------------------*/
701 keyboard_is_initialized = 1;
704 /*---------------------------------------------------------------------------*
705 * init keyboard overlay table
706 *---------------------------------------------------------------------------*/
708 void ovlinit(int force)
712 if(force || ovlinitflag==0)
714 if(ovlinitflag == 0 &&
715 (ovltbl = (Ovl_tbl *)malloc(sizeof(Ovl_tbl) * OVLTBL_SIZE,
716 M_DEVBUF, M_WAITOK)) == NULL)
717 panic("pcvt_kbd: malloc of Ovl_tbl failed");
719 for(i=0; i<OVLTBL_SIZE; i++)
723 ovltbl[i].unshift[0] =
726 ovltbl[i].altgr[0] = 0;
730 ovltbl[i].suba = KBD_SUBT_STR; /* just strings .. */
732 for(i=0; i<=MAXKEYNUM; i++)
733 key2ascii[i].type &= KBD_MASK;
738 /*---------------------------------------------------------------------------*
739 * get original key definition
740 *---------------------------------------------------------------------------*/
742 getokeydef(unsigned key, Ovl_tbl *thisdef)
744 if(key == 0 || key > MAXKEYNUM)
747 thisdef->keynum = key;
748 thisdef->type = key2ascii[key].type;
750 if(key2ascii[key].unshift.subtype == STR)
752 bcopy((u_char *)(key2ascii[key].unshift.what.string),
753 thisdef->unshift, CODE_SIZE);
754 thisdef->subu = KBD_SUBT_STR;
758 bcopy("", thisdef->unshift, CODE_SIZE);
759 thisdef->subu = KBD_SUBT_FNC;
762 if(key2ascii[key].shift.subtype == STR)
764 bcopy((u_char *)(key2ascii[key].shift.what.string),
765 thisdef->shift, CODE_SIZE);
766 thisdef->subs = KBD_SUBT_STR;
770 bcopy("",thisdef->shift,CODE_SIZE);
771 thisdef->subs = KBD_SUBT_FNC;
774 if(key2ascii[key].ctrl.subtype == STR)
776 bcopy((u_char *)(key2ascii[key].ctrl.what.string),
777 thisdef->ctrl, CODE_SIZE);
778 thisdef->subc = KBD_SUBT_STR;
782 bcopy("",thisdef->ctrl,CODE_SIZE);
783 thisdef->subc = KBD_SUBT_FNC;
786 /* deliver at least anything for ALTGR settings ... */
788 if(key2ascii[key].unshift.subtype == STR)
790 bcopy((u_char *)(key2ascii[key].unshift.what.string),
791 thisdef->altgr, CODE_SIZE);
792 thisdef->suba = KBD_SUBT_STR;
796 bcopy("",thisdef->altgr, CODE_SIZE);
797 thisdef->suba = KBD_SUBT_FNC;
802 /*---------------------------------------------------------------------------*
803 * get current key definition
804 *---------------------------------------------------------------------------*/
806 getckeydef(unsigned key, Ovl_tbl *thisdef)
808 u_short type = key2ascii[key].type;
813 if(type & KBD_OVERLOAD)
814 *thisdef = ovltbl[key2ascii[key].ovlindex];
816 getokeydef(key,thisdef);
821 /*---------------------------------------------------------------------------*
822 * translate keynumber and returns ptr to associated ascii string
823 * if key is bound to a function, executes it, and ret empty ptr
824 *---------------------------------------------------------------------------*/
826 xlatkey2ascii(U_short key)
828 static u_char capchar[2] = {0, 0};
830 static u_char metachar[3] = {0x1b, 0, 0};
832 static u_char metachar[2] = {0, 0};
834 static Ovl_tbl thisdef;
838 if(key==0) /* ignore the NON-KEY */
841 getckeydef(key&0x7F, &thisdef); /* get the current ASCII value */
843 thisdef.type &= KBD_MASK;
845 if(key&0x80) /* special handling of ALT-KEYPAD */
847 /* is the ALT Key released? */
848 if(thisdef.type==KBD_META || thisdef.type==KBD_ALTGR)
850 if(altkpflag) /* have we been in altkp mode? */
852 capchar[0] = altkpval;
861 switch(thisdef.type) /* convert the keys */
871 more_chars = (u_char *)thisdef.altgr;
873 else if(!ctrl_down && (shift_down || vsp->shift_lock))
875 if(key2ascii[key].shift.subtype == STR)
876 more_chars = (u_char *)thisdef.shift;
878 fnc = key2ascii[key].shift.what.func;
883 if(key2ascii[key].ctrl.subtype == STR)
884 more_chars = (u_char *)thisdef.ctrl;
886 fnc = key2ascii[key].ctrl.what.func;
891 if(key2ascii[key].unshift.subtype == STR)
892 more_chars = (u_char *)thisdef.unshift;
894 fnc = key2ascii[key].unshift.what.func;
898 (*fnc)(); /* execute function */
900 if((more_chars != NULL) && (more_chars[1] == 0))
902 if(vsp->caps_lock && more_chars[0] >= 'a'
903 && more_chars[0] <= 'z')
905 capchar[0] = *more_chars - ('a'-'A');
906 more_chars = capchar;
911 metachar[1] = *more_chars;
913 metachar[0] = *more_chars | 0x80;
915 more_chars = metachar;
948 if(meta_down || altgr_down)
950 if((n = keypad2num[key-91]) >= 0)
954 /* start ALT-KP mode */
968 if(key2ascii[key].shift.subtype == STR)
969 more_chars = (u_char *)thisdef.shift;
971 fnc = key2ascii[key].shift.what.func;
975 if(key2ascii[key].unshift.subtype == STR)
976 more_chars = (u_char *)thisdef.unshift;
978 fnc = key2ascii[key].unshift.what.func;
982 (*fnc)(); /* execute function */
991 if(key2ascii[key].shift.subtype == STR)
992 more_chars = (u_char *)thisdef.shift;
994 fnc = key2ascii[key].shift.what.func;
998 if(key2ascii[key].unshift.subtype == STR)
999 more_chars = (u_char *)thisdef.unshift;
1001 fnc = key2ascii[key].unshift.what.func;
1005 (*fnc)(); /* execute function */
1008 case KBD_NUM: /* special kp-num handling */
1013 more_chars = (u_char *)"\033OP"; /* PF1 */
1025 if(!(vsp->num_lock))
1027 more_chars = (u_char *)thisdef.shift;
1031 more_chars = (u_char *)thisdef.unshift;
1033 if(vsp->lnm && (*more_chars == '\r'))
1035 more_chars = (u_char *)"\r\n"; /* CR LF */
1040 metachar[1] = *more_chars;
1042 metachar[0] = *more_chars | 0x80;
1044 more_chars = metachar;
1048 case KBD_META: /* these keys are */
1049 case KBD_ALTGR: /* handled directly */
1050 case KBD_SCROLL: /* by the keyboard */
1051 case KBD_CAPS: /* handler - they are */
1052 case KBD_SHFTLOCK: /* ignored here */
1060 /*---------------------------------------------------------------------------*
1061 * get keystrokes from the keyboard.
1062 * if noblock = 0, wait until a key is pressed.
1063 * else return NULL if no characters present.
1064 *---------------------------------------------------------------------------*/
1067 extern u_char pcvt_kbd_fifo[];
1068 extern int pcvt_kbd_rptr;
1069 extern short pcvt_kbd_count;
1080 #if PCVT_KBD_FIFO && PCVT_SLOW_INTERRUPT
1084 static u_char kbd_lastkey = 0; /* last keystroke */
1088 u_char extended: 1; /* extended prefix seen */
1089 u_char ext1: 1; /* extended prefix 1 seen */
1090 u_char breakseen: 1; /* break code seen */
1091 u_char vshift: 1; /* virtual shift pending */
1092 u_char vcontrol: 1; /* virtual control pending */
1093 u_char sysrq: 1; /* sysrq pressed */
1097 static char keybuf[2] = {0}; /* the second 0 is a delimiter! */
1098 #endif /* XSERVER */
1100 #ifdef _DEV_KBD_KBDREG_H_
1102 #endif /* _DEV_KBD_KBDREG_H_ */
1106 if(noblock == 31337)
1114 #ifndef _DEV_KBD_KBDREG_H_
1118 /* see if there is data from the keyboard available either from */
1119 /* the keyboard fifo or from the 8042 keyboard controller */
1121 if (pcvt_kbd_count || (inb(CONTROLLER_CTRL) & STATUS_OUTPBF))
1123 if (!pcvt_kbd_count) /* source = 8042 */
1125 PCVT_KBD_DELAY(); /* 7 us delay */
1126 dt = inb(CONTROLLER_DATA); /* get from obuf */
1128 else /* source = keyboard fifo */
1130 dt = pcvt_kbd_fifo[pcvt_kbd_rptr++];
1131 PCVT_DISABLE_INTR();
1134 if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ)
1138 #else /* !PCVT_KB_FIFO */
1140 /* see if there is data from the keyboard available from the 8042 */
1142 if (inb(CONTROLLER_CTRL) & STATUS_OUTPBF)
1144 PCVT_KBD_DELAY(); /* 7 us delay */
1145 dt = inb(CONTROLLER_DATA); /* yes, get data */
1147 #endif /* !PCVT_KBD_FIFO */
1149 #else /* _DEV_KBD_KBDREG_H_ */
1152 if (pcvt_kbd_count) {
1153 dt = pcvt_kbd_fifo[pcvt_kbd_rptr++];
1154 PCVT_DISABLE_INTR();
1157 if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ)
1160 #endif /* PCVT_KBD_FIFO */
1162 while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, TRUE)) == -1)
1166 if ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) == -1)
1173 #endif /* !_DEV_KBD_KBDREG_H_ */
1176 * If x mode is active, only care for locking keys, then
1177 * return the scan code instead of any key translation.
1178 * Additionally, this prevents us from any attempts to
1179 * execute pcvt internal functions caused by keys (such
1180 * as screen flipping).
1181 * XXX For now, only the default locking key definitions
1182 * are recognized (i.e. if you have overloaded you "A" key
1183 * as NUMLOCK, that wont effect X mode:-)
1184 * Changing this would be nice, but would require modifi-
1185 * cations to the X server. After having this, X will
1186 * deal with the LEDs itself, so we are committed.
1189 * Iff PCVT_USL_VT_COMPAT is defined, the behaviour has
1190 * been fixed. We need not care about any keys here, since
1191 * there are ioctls that deal with the lock key / LED stuff.
1197 #if PCVT_FREEBSD > 210
1198 add_keyboard_randomness(dt);
1199 #endif /* PCVT_FREEBSD > 210 */
1201 #if !PCVT_USL_VT_COMPAT
1202 if ((dt & 0x80) == 0)
1207 /* XXX on which virt screen? */ vsp->num_lock ^= 1;
1212 vsp->caps_lock ^= 1;
1217 vsp->scroll_lock ^= 1;
1221 #endif /* !PCVT_USL_VT_COMPAT */
1225 * The (mouse systems) mouse emulator. The mouse
1226 * device allocates the first device node that is
1227 * not used by a virtual terminal. (E.g., you have
1228 * eight vtys, /dev/ttyv0 thru /dev/ttyv7, so the
1229 * mouse emulator were /dev/ttyv8.)
1230 * Currently the emulator only works if the keyboard
1231 * is in raw (PC scan code) mode. This is the typic-
1232 * al case when running the X server.
1233 * It is activated if the num locks LED is active
1234 * for the current vty, and if the mouse device
1235 * has been opened by at least one process. It
1236 * grabs the numerical keypad events (but only
1237 * the "non-extended", so the separate arrow keys
1238 * continue to work), and three keys for the "mouse
1239 * buttons", preferrably F1 thru F3. Any of the
1240 * eight directions (N, NE, E, SE, S, SW, W, NW)
1241 * is supported, and frequent key presses (less
1242 * than e.g. half a second between key presses)
1243 * cause the emulator to accelerate the pointer
1244 * movement by 6, while single presses result in
1245 * single moves, so each point can be reached.
1248 * NB: the following code is spagghetti.
1249 * Only eat it with lotta tomato ketchup and
1250 * Parmesan cheese:-)
1253 * look whether we will have to steal the keys
1254 * and cook them into mouse events
1256 if(vsp->num_lock && mouse.opened)
1258 int button, accel, i;
1261 MOUSE_NW, MOUSE_N, MOUSE_NE,
1262 MOUSE_W, MOUSE_0, MOUSE_E,
1263 MOUSE_SW, MOUSE_S, MOUSE_SE
1268 struct tty *mousetty;
1271 * strings to send for each mouse event,
1272 * indexed by the movement direction and
1273 * the "accelerator" value (TRUE for frequent
1274 * key presses); note that the first byte
1275 * of each string is actually overwritten
1276 * by the current button value before sending
1279 static u_char mousestrings[2][MOUSE_SE+1][5] =
1282 /* first, the non-accelerated strings*/
1283 {0x87, -1, 1, 0, 0}, /* NW */
1284 {0x87, 0, 1, 0, 0}, /* N */
1285 {0x87, 1, 1, 0, 0}, /* NE */
1286 {0x87, -1, 0, 0, 0}, /* W */
1287 {0x87, 0, 0, 0, 0}, /* 0 */
1288 {0x87, 1, 0, 0, 0}, /* E */
1289 {0x87, -1, -1, 0, 0}, /* SW */
1290 {0x87, 0, -1, 0, 0}, /* S */
1291 {0x87, 1, -1, 0, 0} /* SE */
1294 /* now, 6 steps at once */
1295 {0x87, -4, 4, 0, 0}, /* NW */
1296 {0x87, 0, 6, 0, 0}, /* N */
1297 {0x87, 4, 4, 0, 0}, /* NE */
1298 {0x87, -6, 0, 0, 0}, /* W */
1299 {0x87, 0, 0, 0, 0}, /* 0 */
1300 {0x87, 6, 0, 0, 0}, /* E */
1301 {0x87, -4, -4, 0, 0}, /* SW */
1302 {0x87, 0, -6, 0, 0}, /* S */
1303 {0x87, 4, -4, 0, 0} /* SE */
1307 dummy = make_adhoc_dev(&pc_cdevsw, mouse.minor);
1308 mousetty = get_pccons(dummy);
1312 /* ignore extended scan codes */
1313 mouse.extendedseen = 1;
1314 goto no_mouse_event;
1316 if(mouse.extendedseen)
1318 mouse.extendedseen = 0;
1319 goto no_mouse_event;
1321 mouse.extendedseen = 0;
1324 * Note that we cannot use a switch here
1325 * since we want to have the keycodes in
1328 if((dt & 0x7f) == mousedef.leftbutton) {
1332 else if((dt & 0x7f) == mousedef.middlebutton) {
1336 else if((dt & 0x7f) == mousedef.rightbutton) {
1341 * i would really like to give
1342 * some acustical support
1343 * (pling/plong); i am not sure
1344 * whether it is safe to call
1345 * sysbeep from within an intr
1346 * service, since it calls
1347 * timeout in turn which mani-
1348 * pulates the spl mask - jw
1351 # define PLING sysbeep(PCVT_SYSBEEPF / 1500, 2)
1352 # define PLONG sysbeep(PCVT_SYSBEEPF / 1200, 2)
1354 if(mousedef.stickybuttons)
1357 mouse.breakseen = 1;
1360 else if(mouse.buttons == button
1361 && !mouse.breakseen) {
1362 /* ignore repeats */
1366 mouse.breakseen = 0;
1367 if(mouse.buttons == button) {
1373 * eventually, release
1375 * and stick this one
1377 mouse.buttons = button;
1388 else if((mouse.buttons
1394 /*else: ignore same btn press*/
1401 else switch(dt & 0x7f)
1403 /* the arrow keys - KP 1 thru KP 9 */
1404 case 0x47: move = MOUSE_NW; goto do_move;
1405 case 0x48: move = MOUSE_N; goto do_move;
1406 case 0x49: move = MOUSE_NE; goto do_move;
1407 case 0x4b: move = MOUSE_W; goto do_move;
1408 case 0x4c: move = MOUSE_0; goto do_move;
1409 case 0x4d: move = MOUSE_E; goto do_move;
1410 case 0x4f: move = MOUSE_SW; goto do_move;
1411 case 0x50: move = MOUSE_S; goto do_move;
1412 case 0x51: move = MOUSE_SE;
1416 * arrow key break events are
1417 * of no importance for us
1421 * see whether the last move did
1422 * happen "recently", i.e. before
1423 * less than half a second
1426 timevalsub(&now, &mouse.lastmove);
1427 getmicrotime(&mouse.lastmove);
1428 accel = (now.tv_sec == 0
1430 < mousedef.acceltime);
1433 default: /* not a mouse-emulating key */
1434 goto no_mouse_event;
1436 mousestrings[accel][move][0] =
1437 0x80 + (~mouse.buttons & 7);
1438 /* finally, send the string */
1439 for(i = 0; i < 5; i++)
1440 (*linesw[mousetty->t_line].l_rint)
1441 (mousestrings[accel][move][i],
1443 return (u_char *)0; /* not a kbd event */
1447 #endif /* PCVT_EMU_MOUSE */
1449 return ((u_char *)keybuf);
1453 #else /* !XSERVER */
1455 #ifndef _DEV_KBD_KBDREG_H_
1459 /* see if there is data from the keyboard available either from */
1460 /* the keyboard fifo or from the 8042 keyboard controller */
1462 if (pcvt_kbd_count || (inb(CONTROLLER_CTRL) & STATUS_OUTPBF))
1464 if (!noblock || kbd_polling) /* source = 8042 */
1466 PCVT_KBD_DELAY(); /* 7 us delay */
1467 dt = inb(CONTROLLER_DATA);
1469 else /* source = keyboard fifo */
1471 dt = pcvt_kbd_fifo[pcvt_kbd_rptr++]; /* yes, get it ! */
1472 PCVT_DISABLE_INTR();
1475 if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ)
1480 #else /* !PCVT_KBD_FIFO */
1482 /* see if there is data from the keyboard available from the 8042 */
1484 if(inb(CONTROLLER_CTRL) & STATUS_OUTPBF)
1486 PCVT_KBD_DELAY(); /* 7 us delay */
1487 dt = inb(CONTROLLER_DATA); /* yes, get data ! */
1490 #endif /* !PCVT_KBD_FIFO */
1492 #else /* _DEV_KBD_KBDREG_H_ */
1495 if (pcvt_kbd_count) {
1496 dt = pcvt_kbd_fifo[pcvt_kbd_rptr++];
1497 PCVT_DISABLE_INTR();
1500 if (pcvt_kbd_rptr >= PCVT_KBD_FIFO_SZ)
1503 #endif /* PCVT_KBD_FIFO */
1505 while ((c = (*kbdsw[kbd->kb_index]->read)(kbd, TRUE)) == -1)
1509 if ((c = (*kbdsw[kbd->kb_index]->read)(kbd, FALSE)) == -1)
1514 #endif /* !_DEV_KBD_KBDREG_H_ */
1516 #endif /* !XSERVER */
1518 #ifndef _DEV_KBD_KBDREG_H_
1526 #endif /* !_DEV_KBD_KBDREG_H_ */
1530 #endif /* PCVT_SHOWKEYS */
1532 /* lets look what we got */
1535 case KEYB_R_OVERRUN0: /* keyboard buffer overflow */
1537 #if PCVT_SCANSET == 2
1538 case KEYB_R_SELFOK: /* keyboard selftest ok */
1539 #endif /* PCVT_SCANSET == 2 */
1541 case KEYB_R_ECHO: /* keyboard response to KEYB_C_ECHO */
1542 case KEYB_R_ACK: /* acknowledge after command has rx'd*/
1543 case KEYB_R_SELFBAD: /* keyboard selftest FAILED */
1544 case KEYB_R_DIAGBAD: /* keyboard self diagnostic failure */
1545 case KEYB_R_RESEND: /* keyboard wants us to resend cmnd */
1546 case KEYB_R_OVERRUN1: /* keyboard buffer overflow */
1549 case KEYB_R_EXT1: /* keyboard extended scancode pfx 2 */
1550 kbd_status.ext1 = 1;
1552 case KEYB_R_EXT0: /* keyboard extended scancode pfx 1 */
1553 kbd_status.extended = 1;
1556 #if PCVT_SCANSET == 2
1557 case KEYB_R_BREAKPFX: /* break code prefix for set 2 and 3 */
1558 kbd_status.breakseen = 1;
1560 #endif /* PCVT_SCANSET == 2 */
1563 goto regular; /* regular key */
1571 /* got a normal scan key */
1574 #if PCVT_FREEBSD > 210
1575 add_keyboard_randomness(dt);
1576 #endif /* PCVT_FREEBSD > 210 */
1578 #if PCVT_SCANSET == 1
1579 kbd_status.breakseen = dt & 0x80 ? 1 : 0;
1581 #endif /* PCVT_SCANSET == 1 */
1583 /* make a keycode from scan code */
1584 if(dt >= sizeof scantokey / sizeof(u_char))
1587 key = kbd_status.extended ? extscantokey[dt] : scantokey[dt];
1589 if(kbd_status.ext1 && key == 64)
1590 /* virtual control key */
1593 kbd_status.extended = kbd_status.ext1 = 0;
1595 if ((key == 85) && shift_down && kbd_lastkey != 85)
1597 if (vsp->scr_offset > (vsp->screen_rows - 1))
1599 if (!vsp->scrolling)
1601 vsp->scrolling += vsp->screen_rows - 2;
1602 if (vsp->Scrollback)
1604 scrollback_save_screen();
1605 if (vsp->scr_offset == vsp->max_off)
1607 bcopy(vsp->Scrollback +
1611 vsp->max_off * CHR);
1614 bcopy(vsp->Crtat + vsp->cur_offset -
1615 vsp->col, vsp->Scrollback +
1616 ((vsp->scr_offset + 1) *
1617 vsp->maxcol), vsp->maxcol * CHR);
1624 vsp->scrolling += vsp->screen_rows - 1;
1626 if (vsp->scrolling > vsp->scr_offset)
1627 vsp->scrolling = vsp->scr_offset;
1629 bcopy(vsp->Scrollback + ((vsp->scr_offset -
1630 vsp->scrolling) * vsp->maxcol), vsp->Crtat,
1631 vsp->screen_rows * vsp->maxcol * CHR);
1637 else if ((key == 86) && shift_down && kbd_lastkey != 86)
1641 if (vsp->scrolling > 0)
1643 vsp->scrolling -= vsp->screen_rows - 1;
1644 if (vsp->scrolling < 0)
1647 if (vsp->scrolling <= vsp->screen_rows)
1650 scrollback_restore_screen();
1654 bcopy(vsp->Scrollback + ((vsp->scr_offset -
1655 vsp->scrolling) * vsp->maxcol),
1656 vsp->Crtat, vsp->screen_rows *
1661 if (vsp->scrolling == 0)
1669 if (noblock == 31337)
1682 else if (vsp->scrolling && key != 128 && key != 44 && key != 85 &&
1689 #if PCVT_CTRL_ALT_DEL /* Check for cntl-alt-del */
1690 if((key == 76) && ctrl_down && (meta_down||altgr_down))
1692 #endif /* PCVT_CTRL_ALT_DEL */
1694 #if !(PCVT_NETBSD || PCVT_FREEBSD >= 200)
1695 #include "use_ddb.h"
1696 #endif /* !(PCVT_NETBSD || PCVT_FREEBSD >= 200) */
1698 #if NDDB > 0 || defined(DDB) /* Check for cntl-alt-esc */
1700 if((key == 110) && ctrl_down && (meta_down || altgr_down))
1702 static u_char in_Debugger;
1708 /* the string is actually not used... */
1720 #endif /* NDDB > 0 || defined(DDB) */
1722 /* look for keys with special handling */
1726 * virtual shift; sent around PrtScr, and around the arrow
1727 * keys if the NumLck LED is on
1729 kbd_status.vshift = !kbd_status.breakseen;
1730 key = 0; /* no key */
1735 * virtual control - the most ugly thingie at all
1736 * the Pause key sends:
1737 * <virtual control make> <numlock make> <virtual control
1738 * break> <numlock break>
1740 if(!kbd_status.breakseen)
1741 kbd_status.vcontrol = 1;
1742 /* else: let the numlock hook clear this */
1743 key = 0; /* no key */
1747 /* NumLock, look whether this is rather a Pause */
1748 if(kbd_status.vcontrol)
1751 * if this is the final break code of a Pause key,
1752 * clear the virtual control status, too
1754 if(kbd_status.vcontrol && kbd_status.breakseen)
1755 kbd_status.vcontrol = 0;
1760 * a SysRq; some keyboards are brain-dead enough to
1761 * repeat the SysRq key make code by sending PrtScr
1762 * make codes; other keyboards do not repeat SysRq
1763 * at all. We keep track of the SysRq state here.
1765 kbd_status.sysrq = !kbd_status.breakseen;
1770 * PrtScr; look whether this is really PrtScr or rather
1771 * a silly repeat of a SysRq key
1773 if(kbd_status.sysrq)
1774 /* ignore the garbage */
1778 /* in NOREPEAT MODE ignore the key if it was the same as before */
1780 if(!kbrepflag && key == kbd_lastkey && !kbd_status.breakseen)
1788 type = key2ascii[key].type;
1790 if(type & KBD_OVERLOAD)
1791 type = ovltbl[key2ascii[key].ovlindex].type;
1798 if(!kbd_status.breakseen && key != kbd_lastkey)
1800 vsp->shift_lock ^= 1;
1805 if(!kbd_status.breakseen && key != kbd_lastkey)
1807 vsp->caps_lock ^= 1;
1813 if(!kbd_status.breakseen && key != kbd_lastkey)
1815 vsp->scroll_lock ^= 1;
1818 if(!(vsp->scroll_lock))
1820 /* someone may be sleeping */
1821 wakeup((caddr_t)&(vsp->scroll_lock));
1827 shift_down = kbd_status.breakseen ? 0 : 1;
1831 meta_down = kbd_status.breakseen ? 0 : 0x80;
1835 altgr_down = kbd_status.breakseen ? 0 : 1;
1839 ctrl_down = kbd_status.breakseen ? 0 : 1;
1844 break; /* deliver a key */
1847 if(kbd_status.breakseen)
1850 kbd_status.breakseen = 0;
1851 kbd_lastkey = 0; /* -hv- I know this is a bug with */
1852 } /* N-Key-Rollover, but I ignore that */
1853 else /* because avoidance is too complicated */
1856 cp = xlatkey2ascii(key); /* have a key */
1858 if(cp == NULL && !noblock)
1864 /*---------------------------------------------------------------------------*
1865 * reflect status of locking keys & set led's
1866 *---------------------------------------------------------------------------*/
1868 setlockkeys(int snc)
1870 vsp->scroll_lock = snc & 1;
1871 vsp->num_lock = (snc & 2) ? 1 : 0;
1872 vsp->caps_lock = (snc & 4) ? 1 : 0;
1876 /*---------------------------------------------------------------------------*
1877 * remove a key definition
1878 *---------------------------------------------------------------------------*/
1884 if(key==0 || key > MAXKEYNUM)
1887 if(key2ascii[key].type & KBD_OVERLOAD)
1889 ref = &ovltbl[key2ascii[key].ovlindex];
1896 key2ascii[key].type &= KBD_MASK;
1901 /*---------------------------------------------------------------------------*
1903 *---------------------------------------------------------------------------*/
1905 setkeydef(Ovl_tbl *data)
1909 if( data->keynum > MAXKEYNUM ||
1910 (data->type & KBD_MASK) == KBD_BREAK ||
1911 (data->type & KBD_MASK) > KBD_SHFTLOCK)
1914 data->unshift[KBDMAXOVLKEYSIZE] =
1915 data->shift[KBDMAXOVLKEYSIZE] =
1916 data->ctrl[KBDMAXOVLKEYSIZE] =
1917 data->altgr[KBDMAXOVLKEYSIZE] = 0;
1922 data->suba = KBD_SUBT_STR; /* just strings .. */
1924 data->type |= KBD_OVERLOAD; /* mark overloaded */
1926 /* if key already overloaded, use that slot else find free slot */
1928 if(key2ascii[data->keynum].type & KBD_OVERLOAD)
1930 i = key2ascii[data->keynum].ovlindex;
1934 for(i=0; i<OVLTBL_SIZE; i++)
1935 if(ovltbl[i].keynum==0)
1939 return ENOSPC; /* no space, abuse of ENOSPC(!) */
1942 ovltbl[i] = *data; /* copy new data string */
1944 key2ascii[data->keynum].type |= KBD_OVERLOAD; /* mark key */
1945 key2ascii[data->keynum].ovlindex = i;
1950 /*---------------------------------------------------------------------------*
1951 * keyboard ioctl's entry
1952 *---------------------------------------------------------------------------*/
1954 kbdioctl(Dev_t dev, int cmd, caddr_t data, int flag)
1963 settpmrate(KBD_TPD500|KBD_TPM100);
1968 *(int *)data = tpmrate;
1972 settpmrate(*(int *)data);
1976 *(int *)data = kbrepflag;
1980 kbrepflag = (*(int *)data) & 1;
1984 *(int *)data = ledstate;
1988 update_led(); /* ? */
1992 *(int *)data = ( (vsp->scroll_lock) |
1993 (vsp->num_lock * 2) |
1994 (vsp->caps_lock * 4));
1998 setlockkeys(*(int *)data);
2002 key = ((Ovl_tbl *)data)->keynum;
2003 return getckeydef(key,(Ovl_tbl *)data);
2006 key = ((Ovl_tbl *)data)->keynum;
2007 return setkeydef((Ovl_tbl *)data);
2010 key = ((Ovl_tbl *)data)->keynum;
2011 return getokeydef(key,(Ovl_tbl *)data);
2015 return rmkeydef(key);
2022 /* proceed with vga ioctls */
2029 /*--------------------------------------------------------------------------*
2030 * mouse emulator ioctl
2031 *--------------------------------------------------------------------------*/
2033 mouse_ioctl(Dev_t dev, int cmd, caddr_t data)
2035 struct mousedefs *def = (struct mousedefs *)data;
2052 #endif /* PCVT_EMU_MOUSE */
2054 #if PCVT_USL_VT_COMPAT
2055 /*---------------------------------------------------------------------------*
2056 * convert ISO-8859 style keycode into IBM 437
2057 *---------------------------------------------------------------------------*/
2058 static __inline u_char
2063 return iso2ibm437[c - 0x80];
2066 /*---------------------------------------------------------------------------*
2067 * build up a USL style keyboard map
2068 *---------------------------------------------------------------------------*/
2070 get_usl_keymap(keymap_t *map)
2074 bzero((caddr_t)map, sizeof(keymap_t));
2076 map->n_keys = 0x59; /* that many keys we know about */
2078 for(i = 1; i < N_KEYNUMS; i++)
2083 int idx = key2scan1[i];
2085 if(idx == 0 || idx >= map->n_keys)
2088 getckeydef(i, &kdef);
2089 kdef.type &= KBD_MASK;
2094 map->key[idx].map[0] = iso2ibm(kdef.unshift[0]);
2095 map->key[idx].map[1] = iso2ibm(kdef.shift[0]);
2096 map->key[idx].map[2] = map->key[idx].map[3] =
2097 iso2ibm(kdef.ctrl[0]);
2098 map->key[idx].map[4] = map->key[idx].map[5] =
2099 iso2ibm(c = kdef.altgr[0]);
2101 * XXX this is a hack
2102 * since we currently do not map strings to AltGr +
2103 * shift, we attempt to use the unshifted AltGr
2104 * definition here and try to toggle the case
2105 * this should at least work for ISO8859 letters,
2106 * but also for (e.g.) russian KOI-8 style
2108 if((c & 0x7f) >= 0x40)
2109 map->key[idx].map[5] = iso2ibm(c ^ 0x20);
2113 /* we are only interested in F1 thru F12 here */
2114 if(i >= 112 && i <= 123) {
2115 map->key[idx].map[0] = i - 112 + 27;
2116 map->key[idx].spcl = 0x80;
2121 c = i == 44? 2 /* lSh */: 3 /* rSh */; goto special;
2124 c = 4; goto special;
2127 c = 5; goto special;
2130 c = 6; goto special;
2133 c = 7; goto special;
2136 c = 9; goto special;
2138 for(j = 0; j < NUM_STATES; j++)
2139 map->key[idx].map[j] = c;
2140 map->key[idx].spcl = 0xff;
2149 #endif /* PCVT_USL_VT_COMPAT */
2151 /*---------------------------------------------------------------------------*
2152 * switch keypad to numeric mode
2153 *---------------------------------------------------------------------------*/
2155 vt_keynum(struct video_state *svsp)
2161 /*---------------------------------------------------------------------------*
2162 * switch keypad to application mode
2163 *---------------------------------------------------------------------------*/
2165 vt_keyappl(struct video_state *svsp)
2171 #if !PCVT_VT220KEYB /* !PCVT_VT220KEYB, HP-like Keyboard layout */
2173 /*---------------------------------------------------------------------------*
2174 * function bound to function key 1
2175 *---------------------------------------------------------------------------*/
2181 if((vsp->vt_pure_mode == M_HPVT)
2182 && (vsp->which_fkl == SYS_FKL))
2185 more_chars = (u_char *)"\033[17~"; /* F6 */
2189 if(vsp->vt_pure_mode == M_PUREVT
2190 || (vsp->which_fkl == USR_FKL))
2191 more_chars = (u_char *)"\033[26~"; /* F14 */
2195 /*---------------------------------------------------------------------------*
2196 * function bound to function key 2
2197 *---------------------------------------------------------------------------*/
2203 if((vsp->vt_pure_mode == M_HPVT)
2204 && (vsp->which_fkl == SYS_FKL))
2207 more_chars = (u_char *)"\033[18~"; /* F7 */
2211 if(vsp->vt_pure_mode == M_PUREVT
2212 || (vsp->which_fkl == USR_FKL))
2213 more_chars = (u_char *)"\033[28~"; /* HELP */
2217 /*---------------------------------------------------------------------------*
2218 * function bound to function key 3
2219 *---------------------------------------------------------------------------*/
2225 if((vsp->vt_pure_mode == M_HPVT)
2226 && (vsp->which_fkl == SYS_FKL))
2229 more_chars = (u_char *)"\033[19~"; /* F8 */
2233 if(vsp->vt_pure_mode == M_PUREVT
2234 || (vsp->which_fkl == USR_FKL))
2235 more_chars = (u_char *)"\033[29~"; /* DO */
2239 /*---------------------------------------------------------------------------*
2240 * function bound to function key 4
2241 *---------------------------------------------------------------------------*/
2249 if((vsp->vt_pure_mode == M_HPVT)
2250 && (vsp->which_fkl == SYS_FKL))
2253 more_chars = (u_char *)"\033[20~"; /* F9 */
2255 if(vsp->vt_pure_mode == M_PUREVT
2256 || (vsp->which_fkl == USR_FKL))
2257 more_chars = (u_char *)"\033[20~"; /* F9 */
2258 #endif /* PCVT_SHOWKEYS */
2263 if(vsp->vt_pure_mode == M_PUREVT
2264 || (vsp->which_fkl == USR_FKL))
2265 more_chars = (u_char *)"\033[31~"; /* F17 */
2269 /*---------------------------------------------------------------------------*
2270 * function bound to function key 5
2271 *---------------------------------------------------------------------------*/
2277 if((vsp->vt_pure_mode == M_HPVT)
2278 && (vsp->which_fkl == SYS_FKL))
2281 more_chars = (u_char *)"\033[21~"; /* F10 */
2285 if(vsp->vt_pure_mode == M_PUREVT
2286 || (vsp->which_fkl == USR_FKL))
2287 more_chars = (u_char *)"\033[32~"; /* F18 */
2291 /*---------------------------------------------------------------------------*
2292 * function bound to function key 6
2293 *---------------------------------------------------------------------------*/
2299 if((vsp->vt_pure_mode == M_HPVT)
2300 && (vsp->which_fkl == SYS_FKL))
2301 toggl_sevenbit(vsp);
2303 more_chars = (u_char *)"\033[23~"; /* F11 */
2307 if(vsp->vt_pure_mode == M_PUREVT
2308 || (vsp->which_fkl == USR_FKL))
2309 more_chars = (u_char *)"\033[33~"; /* F19 */
2313 /*---------------------------------------------------------------------------*
2314 * function bound to function key 7
2315 *---------------------------------------------------------------------------*/
2321 if((vsp->vt_pure_mode == M_HPVT)
2322 && (vsp->which_fkl == SYS_FKL))
2325 more_chars = (u_char *)"\033[24~"; /* F12 */
2329 if(vsp->vt_pure_mode == M_PUREVT
2330 || (vsp->which_fkl == USR_FKL))
2331 more_chars = (u_char *)"\033[34~"; /* F20 */
2335 /*---------------------------------------------------------------------------*
2336 * function bound to function key 8
2337 *---------------------------------------------------------------------------*/
2343 if((vsp->vt_pure_mode == M_HPVT)
2344 && (vsp->which_fkl == SYS_FKL))
2347 more_chars = (u_char *)"\033[25~"; /* F13 */
2351 if(vsp->vt_pure_mode == M_PUREVT
2352 || (vsp->which_fkl == USR_FKL))
2353 more_chars = (u_char *)"\033[35~"; /* F21 ? !! */
2357 /*---------------------------------------------------------------------------*
2358 * function bound to function key 9
2359 *---------------------------------------------------------------------------*/
2365 if(vsp->vt_pure_mode == M_PUREVT)
2368 if(vsp->labels_on) /* toggle label display on/off */
2379 /*---------------------------------------------------------------------------*
2380 * function bound to function key 10
2381 *---------------------------------------------------------------------------*/
2387 if(vsp->vt_pure_mode != M_PUREVT && vsp->labels_on)
2389 if(vsp->which_fkl == USR_FKL)
2391 else if(vsp->which_fkl == SYS_FKL)
2401 /*---------------------------------------------------------------------------*
2402 * function bound to function key 11
2403 *---------------------------------------------------------------------------*/
2409 if(vsp->vt_pure_mode == M_PUREVT)
2410 set_emulation_mode(vsp, M_HPVT);
2411 else if(vsp->vt_pure_mode == M_HPVT)
2412 set_emulation_mode(vsp, M_PUREVT);
2420 /*---------------------------------------------------------------------------*
2421 * function bound to function key 12
2422 *---------------------------------------------------------------------------*/
2428 if(current_video_screen + 1 > totalscreens-1)
2431 do_vgapage(current_video_screen + 1);
2439 /*---------------------------------------------------------------------------*
2440 * function bound to SHIFTED function key 1
2441 *---------------------------------------------------------------------------*/
2447 if(vsp->ukt.length[0]) /* entry available ? */
2448 more_chars = (u_char *)
2449 &(vsp->udkbuf[vsp->ukt.first[0]]);
2453 if(vsp->ukt.length[9]) /* entry available ? */
2454 more_chars = (u_char *)
2455 &(vsp->udkbuf[vsp->ukt.first[9]]);
2459 /*---------------------------------------------------------------------------*
2460 * function bound to SHIFTED function key 2
2461 *---------------------------------------------------------------------------*/
2467 if(vsp->ukt.length[1]) /* entry available ? */
2468 more_chars = (u_char *)
2469 &(vsp->udkbuf[vsp->ukt.first[1]]);
2473 if(vsp->ukt.length[11]) /* entry available ? */
2474 more_chars = (u_char *)
2475 &(vsp->udkbuf[vsp->ukt.first[11]]);
2479 /*---------------------------------------------------------------------------*
2480 * function bound to SHIFTED function key 3
2481 *---------------------------------------------------------------------------*/
2487 if(vsp->ukt.length[2]) /* entry available ? */
2488 more_chars = (u_char *)
2489 &(vsp->udkbuf[vsp->ukt.first[2]]);
2493 if(vsp->ukt.length[12]) /* entry available ? */
2494 more_chars = (u_char *)
2495 &(vsp->udkbuf[vsp->ukt.first[12]]);
2499 /*---------------------------------------------------------------------------*
2500 * function bound to SHIFTED function key 4
2501 *---------------------------------------------------------------------------*/
2507 if(vsp->ukt.length[3]) /* entry available ? */
2508 more_chars = (u_char *)
2509 &(vsp->udkbuf[vsp->ukt.first[3]]);
2513 if(vsp->ukt.length[13]) /* entry available ? */
2514 more_chars = (u_char *)
2515 &(vsp->udkbuf[vsp->ukt.first[13]]);
2519 /*---------------------------------------------------------------------------*
2520 * function bound to SHIFTED function key 5
2521 *---------------------------------------------------------------------------*/
2527 if(vsp->ukt.length[4]) /* entry available ? */
2528 more_chars = (u_char *)
2529 &(vsp->udkbuf[vsp->ukt.first[4]]);
2533 if(vsp->ukt.length[14]) /* entry available ? */
2534 more_chars = (u_char *)
2535 &(vsp->udkbuf[vsp->ukt.first[14]]);
2539 /*---------------------------------------------------------------------------*
2540 * function bound to SHIFTED function key 6
2541 *---------------------------------------------------------------------------*/
2547 if(vsp->ukt.length[6]) /* entry available ? */
2548 more_chars = (u_char *)
2549 &(vsp->udkbuf[vsp->ukt.first[6]]);
2553 if(vsp->ukt.length[15]) /* entry available ? */
2554 more_chars = (u_char *)
2555 &(vsp->udkbuf[vsp->ukt.first[15]]);
2559 /*---------------------------------------------------------------------------*
2560 * function bound to SHIFTED function key 7
2561 *---------------------------------------------------------------------------*/
2567 if(vsp->ukt.length[7]) /* entry available ? */
2568 more_chars = (u_char *)
2569 &(vsp->udkbuf[vsp->ukt.first[7]]);
2573 if(vsp->ukt.length[16]) /* entry available ? */
2574 more_chars = (u_char *)
2575 &(vsp->udkbuf[vsp->ukt.first[16]]);
2579 /*---------------------------------------------------------------------------*
2580 * function bound to SHIFTED function key 8
2581 *---------------------------------------------------------------------------*/
2587 if(vsp->ukt.length[8]) /* entry available ? */
2588 more_chars = (u_char *)
2589 &(vsp->udkbuf[vsp->ukt.first[8]]);
2593 if(vsp->ukt.length[17]) /* entry available ? */
2594 more_chars = (u_char *)
2595 &(vsp->udkbuf[vsp->ukt.first[17]]);
2598 /*---------------------------------------------------------------------------*
2599 * function bound to SHIFTED function key 9
2600 *---------------------------------------------------------------------------*/
2606 /*---------------------------------------------------------------------------*
2607 * function bound to SHIFTED function key 10
2608 *---------------------------------------------------------------------------*/
2614 /*---------------------------------------------------------------------------*
2615 * function bound to SHIFTED function key 11
2616 *---------------------------------------------------------------------------*/
2622 /*---------------------------------------------------------------------------*
2623 * function bound to SHIFTED function key 12
2624 *---------------------------------------------------------------------------*/
2630 /*---------------------------------------------------------------------------*
2631 * function bound to control function key 1
2632 *---------------------------------------------------------------------------*/
2640 /*---------------------------------------------------------------------------*
2641 * function bound to control function key 2
2642 *---------------------------------------------------------------------------*/
2650 /*---------------------------------------------------------------------------*
2651 * function bound to control function key 3
2652 *---------------------------------------------------------------------------*/
2660 /*---------------------------------------------------------------------------*
2661 * function bound to control function key 4
2662 *---------------------------------------------------------------------------*/
2670 /*---------------------------------------------------------------------------*
2671 * function bound to control function key 5
2672 *---------------------------------------------------------------------------*/
2680 /*---------------------------------------------------------------------------*
2681 * function bound to control function key 6
2682 *---------------------------------------------------------------------------*/
2690 /*---------------------------------------------------------------------------*
2691 * function bound to control function key 7
2692 *---------------------------------------------------------------------------*/
2700 /*---------------------------------------------------------------------------*
2701 * function bound to control function key 8
2702 *---------------------------------------------------------------------------*/
2710 /*---------------------------------------------------------------------------*
2711 * function bound to control function key 9
2712 *---------------------------------------------------------------------------*/
2720 /*---------------------------------------------------------------------------*
2721 * function bound to control function key 10
2722 *---------------------------------------------------------------------------*/
2730 /*---------------------------------------------------------------------------*
2731 * function bound to control function key 11
2732 *---------------------------------------------------------------------------*/
2740 /*---------------------------------------------------------------------------*
2741 * function bound to control function key 12
2742 *---------------------------------------------------------------------------*/
2750 #else /* PCVT_VT220 - VT220-like Keyboard layout */
2752 /*---------------------------------------------------------------------------*
2753 * function bound to function key 1
2754 *---------------------------------------------------------------------------*/
2759 more_chars = (u_char *)"\033[23~"; /* F11 */
2764 /*---------------------------------------------------------------------------*
2765 * function bound to function key 2
2766 *---------------------------------------------------------------------------*/
2771 more_chars = (u_char *)"\033[24~"; /* F12 */
2776 /*---------------------------------------------------------------------------*
2777 * function bound to function key 3
2778 *---------------------------------------------------------------------------*/
2783 more_chars = (u_char *)"\033[25~"; /* F13 */
2788 /*---------------------------------------------------------------------------*
2789 * function bound to function key 4
2790 *---------------------------------------------------------------------------*/
2795 more_chars = (u_char *)"\033[26~"; /* F14 */
2800 /*---------------------------------------------------------------------------*
2801 * function bound to function key 5
2802 *---------------------------------------------------------------------------*/
2807 more_chars = (u_char *)"\033[28~"; /* Help */
2810 if((current_video_screen + 1) > totalscreens-1)
2813 do_vgapage(current_video_screen + 1);
2817 /*---------------------------------------------------------------------------*
2818 * function bound to function key 6
2819 *---------------------------------------------------------------------------*/
2824 more_chars = (u_char *)"\033[29~"; /* DO */
2826 more_chars = (u_char *)"\033[17~"; /* F6 */
2829 /*---------------------------------------------------------------------------*
2830 * function bound to function key 7
2831 *---------------------------------------------------------------------------*/
2836 more_chars = (u_char *)"\033[31~"; /* F17 */
2838 more_chars = (u_char *)"\033[18~"; /* F7 */
2841 /*---------------------------------------------------------------------------*
2842 * function bound to function key 8
2843 *---------------------------------------------------------------------------*/
2848 more_chars = (u_char *)"\033[32~"; /* F18 */
2850 more_chars = (u_char *)"\033[19~"; /* F8 */
2853 /*---------------------------------------------------------------------------*
2854 * function bound to function key 9
2855 *---------------------------------------------------------------------------*/
2860 more_chars = (u_char *)"\033[33~"; /* F19 */
2862 more_chars = (u_char *)"\033[20~"; /* F9 */
2865 /*---------------------------------------------------------------------------*
2866 * function bound to function key 10
2867 *---------------------------------------------------------------------------*/
2872 more_chars = (u_char *)"\033[34~"; /* F20 */
2874 more_chars = (u_char *)"\033[21~"; /* F10 */
2877 /*---------------------------------------------------------------------------*
2878 * function bound to function key 11
2879 *---------------------------------------------------------------------------*/
2884 more_chars = (u_char *)"\0x8FP"; /* PF1 */
2886 more_chars = (u_char *)"\033[23~"; /* F11 */
2889 /*---------------------------------------------------------------------------*
2890 * function bound to function key 12
2891 *---------------------------------------------------------------------------*/
2896 more_chars = (u_char *)"\0x8FQ"; /* PF2 */
2898 more_chars = (u_char *)"\033[24~"; /* F12 */
2901 /*---------------------------------------------------------------------------*
2902 * function bound to SHIFTED function key 1
2903 *---------------------------------------------------------------------------*/
2909 if(vsp->ukt.length[6]) /* entry available ? */
2910 more_chars = (u_char *)
2911 &(vsp->udkbuf[vsp->ukt.first[6]]);
2913 more_chars = (u_char *)"\033[23~"; /* F11 */
2921 /*---------------------------------------------------------------------------*
2922 * function bound to SHIFTED function key 2
2923 *---------------------------------------------------------------------------*/
2929 if(vsp->ukt.length[7]) /* entry available ? */
2930 more_chars = (u_char *)
2931 &(vsp->udkbuf[vsp->ukt.first[7]]);
2933 more_chars = (u_char *)"\033[24~"; /* F12 */
2941 /*---------------------------------------------------------------------------*
2942 * function bound to SHIFTED function key 3
2943 *---------------------------------------------------------------------------*/
2949 if(vsp->ukt.length[8]) /* entry available ? */
2950 more_chars = (u_char *)
2951 &(vsp->udkbuf[vsp->ukt.first[8]]);
2953 more_chars = (u_char *)"\033[25~"; /* F13 */
2961 /*---------------------------------------------------------------------------*
2962 * function bound to SHIFTED function key 4
2963 *---------------------------------------------------------------------------*/
2969 if(vsp->ukt.length[9]) /* entry available ? */
2970 more_chars = (u_char *)
2971 &(vsp->udkbuf[vsp->ukt.first[9]]);
2973 more_chars = (u_char *)"\033[26~"; /* F14 */
2981 /*---------------------------------------------------------------------------*
2982 * function bound to SHIFTED function key 5
2983 *---------------------------------------------------------------------------*/
2989 if(vsp->ukt.length[11]) /* entry available ? */
2990 more_chars = (u_char *)
2991 &(vsp->udkbuf[vsp->ukt.first[11]]);
2993 more_chars = (u_char *)"\033[28~"; /* Help */
2997 if(current_video_screen <= 0)
2998 do_vgapage(totalscreens-1);
3000 do_vgapage(current_video_screen - 1);
3004 /*---------------------------------------------------------------------------*
3005 * function bound to SHIFTED function key 6
3006 *---------------------------------------------------------------------------*/
3012 if(vsp->ukt.length[0]) /* entry available ? */
3013 more_chars = (u_char *)
3014 &(vsp->udkbuf[vsp->ukt.first[0]]);
3016 more_chars = (u_char *)"\033[17~"; /* F6 */
3018 else if(vsp->ukt.length[12]) /* entry available ? */
3019 more_chars = (u_char *)
3020 &(vsp->udkbuf[vsp->ukt.first[12]]);
3022 more_chars = (u_char *)"\033[29~"; /* DO */
3025 /*---------------------------------------------------------------------------*
3026 * function bound to SHIFTED function key 7
3027 *---------------------------------------------------------------------------*/
3033 if(vsp->ukt.length[1]) /* entry available ? */
3034 more_chars = (u_char *)
3035 &(vsp->udkbuf[vsp->ukt.first[1]]);
3037 more_chars = (u_char *)"\033[18~"; /* F7 */
3039 else if(vsp->ukt.length[14]) /* entry available ? */
3040 more_chars = (u_char *)
3041 &(vsp->udkbuf[vsp->ukt.first[14]]);
3043 more_chars = (u_char *)"\033[31~"; /* F17 */
3046 /*---------------------------------------------------------------------------*
3047 * function bound to SHIFTED function key 8
3048 *---------------------------------------------------------------------------*/
3054 if(vsp->ukt.length[2]) /* entry available ? */
3055 more_chars = (u_char *)
3056 &(vsp->udkbuf[vsp->ukt.first[2]]);
3058 more_chars = (u_char *)"\033[19~"; /* F8 */
3060 else if(vsp->ukt.length[14]) /* entry available ? */
3061 more_chars = (u_char *)
3062 &(vsp->udkbuf[vsp->ukt.first[15]]);
3064 more_chars = (u_char *)"\033[32~"; /* F18 */
3067 /*---------------------------------------------------------------------------*
3068 * function bound to SHIFTED function key 9
3069 *---------------------------------------------------------------------------*/
3075 if(vsp->ukt.length[3]) /* entry available ? */
3076 more_chars = (u_char *)
3077 &(vsp->udkbuf[vsp->ukt.first[3]]);
3079 more_chars = (u_char *)"\033[20~"; /* F9 */
3081 else if(vsp->ukt.length[16]) /* entry available ? */
3082 more_chars = (u_char *)
3083 &(vsp->udkbuf[vsp->ukt.first[16]]);
3085 more_chars = (u_char *)"\033[33~"; /* F19 */
3088 /*---------------------------------------------------------------------------*
3089 * function bound to SHIFTED function key 10
3090 *---------------------------------------------------------------------------*/
3096 if(vsp->ukt.length[4]) /* entry available ? */
3097 more_chars = (u_char *)
3098 &(vsp->udkbuf[vsp->ukt.first[4]]);
3100 more_chars = (u_char *)"\033[21~"; /* F10 */
3102 else if(vsp->ukt.length[17]) /* entry available ? */
3103 more_chars = (u_char *)
3104 &(vsp->udkbuf[vsp->ukt.first[17]]);
3106 more_chars = (u_char *)"\033[34~"; /* F20 */
3109 /*---------------------------------------------------------------------------*
3110 * function bound to SHIFTED function key 11
3111 *---------------------------------------------------------------------------*/
3117 if(vsp->ukt.length[6]) /* entry available ? */
3118 more_chars = (u_char *)
3119 &(vsp->udkbuf[vsp->ukt.first[6]]);
3121 more_chars = (u_char *)"\033[23~"; /* F11 */
3125 /*---------------------------------------------------------------------------*
3126 * function bound to SHIFTED function key 12
3127 *---------------------------------------------------------------------------*/
3133 if(vsp->ukt.length[7]) /* entry available ? */
3134 more_chars = (u_char *)
3135 &(vsp->udkbuf[vsp->ukt.first[7]]);
3137 more_chars = (u_char *)"\033[24~"; /* F12 */
3141 /*---------------------------------------------------------------------------*
3142 * function bound to control function key 1
3143 *---------------------------------------------------------------------------*/
3147 if(vsp->which_fkl == SYS_FKL)
3151 /*---------------------------------------------------------------------------*
3152 * function bound to control function key 2
3153 *---------------------------------------------------------------------------*/
3157 if(vsp->which_fkl == SYS_FKL)
3161 /*---------------------------------------------------------------------------*
3162 * function bound to control function key 3
3163 *---------------------------------------------------------------------------*/
3167 if(vsp->which_fkl == SYS_FKL)
3171 /*---------------------------------------------------------------------------*
3172 * function bound to control function key 4
3173 *---------------------------------------------------------------------------*/
3179 if(vsp->which_fkl == SYS_FKL)
3181 #endif /* PCVT_SHOWKEYS */
3185 /*---------------------------------------------------------------------------*
3186 * function bound to control function key 5
3187 *---------------------------------------------------------------------------*/
3191 if(vsp->which_fkl == SYS_FKL)
3195 /*---------------------------------------------------------------------------*
3196 * function bound to control function key 6
3197 *---------------------------------------------------------------------------*/
3201 if(vsp->which_fkl == SYS_FKL)
3202 toggl_sevenbit(vsp);
3205 /*---------------------------------------------------------------------------*
3206 * function bound to control function key 7
3207 *---------------------------------------------------------------------------*/
3211 if(vsp->which_fkl == SYS_FKL)
3215 /*---------------------------------------------------------------------------*
3216 * function bound to control function key 8
3217 *---------------------------------------------------------------------------*/
3221 if(vsp->which_fkl == SYS_FKL)
3225 /*---------------------------------------------------------------------------*
3226 * function bound to control function key 9
3227 *---------------------------------------------------------------------------*/
3231 if(vsp->labels_on) /* toggle label display on/off */
3237 /*---------------------------------------------------------------------------*
3238 * function bound to control function key 10
3239 *---------------------------------------------------------------------------*/
3243 if(vsp->labels_on) /* toggle user/system fkey labels */
3245 if(vsp->which_fkl == USR_FKL)
3247 else if(vsp->which_fkl == SYS_FKL)
3252 /*---------------------------------------------------------------------------*
3253 * function bound to control function key 11
3254 *---------------------------------------------------------------------------*/
3258 if(vsp->vt_pure_mode == M_PUREVT)
3259 set_emulation_mode(vsp, M_HPVT);
3260 else if(vsp->vt_pure_mode == M_HPVT)
3261 set_emulation_mode(vsp, M_PUREVT);
3264 /*---------------------------------------------------------------------------*
3265 * function bound to control function key 12
3266 *---------------------------------------------------------------------------*/
3272 #endif /* PCVT_VT220KEYB */
3274 /*---------------------------------------------------------------------------*
3276 *---------------------------------------------------------------------------*/
3278 scrollback_save_screen(void)
3283 s = sizeof(u_short) * vsp->screen_rowsize * vsp->maxcol;
3285 if (scrollback_savedscreen)
3286 free(scrollback_savedscreen, M_TEMP);
3290 if (!(scrollback_savedscreen = (u_short *)malloc(s, M_TEMP, M_NOWAIT)))
3295 bcopy(vsp->Crtat, scrollback_savedscreen, scrnsv_size);
3299 /*---------------------------------------------------------------------------*
3301 *---------------------------------------------------------------------------*/
3303 scrollback_restore_screen(void)
3305 if (scrollback_savedscreen)
3306 bcopy(scrollback_savedscreen, vsp->Crtat, scrnsv_size);
3310 #endif /* NVT > 0 */
3312 /* ------------------------------- EOF -------------------------------------*/