void wskbd_input(struct device *dev, u_int type, int value) { struct wskbd_softc *sc = (struct wskbd_softc *)dev; #if NWSDISPLAY > 0 int num; #endif #if NWSDISPLAY > 0 if (sc->sc_repeating) { sc->sc_repeating = 0; timeout_del(&sc->sc_repeat_ch); } /* * If /dev/wskbdN is not connected in event mode translate and * send upstream. */ if (sc->sc_translating) { #ifdef HAVE_BURNER_SUPPORT if (type == WSCONS_EVENT_KEY_DOWN && sc->sc_displaydv != NULL) wsdisplay_burn(sc->sc_displaydv, WSDISPLAY_BURN_KBD); #endif num = wskbd_translate(sc->id, type, value); if (num > 0) { if (sc->sc_displaydv != NULL) { #ifdef HAVE_SCROLLBACK_SUPPORT /* XXX - Shift_R+PGUP(release) emits PrtSc */ if (sc->id->t_symbols[0] != KS_Print_Screen) { wsscrollback(sc->sc_displaydv, WSDISPLAY_SCROLL_RESET); } #endif wsdisplay_kbdinput(sc->sc_displaydv, sc->id->t_keymap.layout, sc->id->t_symbols, num); } if (sc->sc_keyrepeat_data.del1 != 0) { sc->sc_repeating = num; timeout_add_msec(&sc->sc_repeat_ch, sc->sc_keyrepeat_data.del1); } } return; } #endif wskbd_deliver_event(sc, type, value); #if NWSDISPLAY > 0 /* Repeat key presses if enabled. */ if (type == WSCONS_EVENT_KEY_DOWN && sc->sc_keyrepeat_data.del1 != 0) { sc->sc_repeat_type = type; sc->sc_repeat_value = value; sc->sc_repeating = 1; timeout_add_msec(&sc->sc_repeat_ch, sc->sc_keyrepeat_data.del1); } #endif }
void wskbd_repeat(void *v) { struct wskbd_softc *sc = (struct wskbd_softc *)v; int s = spltty(); if (sc->sc_repeating == 0) { /* * race condition: a "key up" event came in when wskbd_repeat() * was already called but not yet spltty()'d */ splx(s); return; } if (sc->sc_translating) { /* deliver keys */ if (sc->sc_displaydv != NULL) wsdisplay_kbdinput(sc->sc_displaydv, sc->id->t_keymap.layout, sc->id->t_symbols, sc->sc_repeating); } else { /* queue event */ wskbd_deliver_event(sc, sc->sc_repeat_type, sc->sc_repeat_value); } if (sc->sc_keyrepeat_data.delN != 0) timeout_add_msec(&sc->sc_repeat_ch, sc->sc_keyrepeat_data.delN); splx(s); }
static void wskbd_repeat(void *v) { struct wskbd_softc *sc = (struct wskbd_softc *)v; int s = spltty(); if (!sc->sc_repeating) { /* * race condition: a "key up" event came in when wskbd_repeat() * was already called but not yet spltty()'d */ splx(s); return; } if (sc->sc_translating) { /* deliver keys */ #if NWSDISPLAY > 0 if (sc->sc_base.me_dispdv != NULL) { int i; for (i = 0; i < sc->sc_repeating; i++) wsdisplay_kbdinput(sc->sc_base.me_dispdv, sc->id->t_symbols[i]); } #endif } else { #if defined(WSKBD_EVENT_AUTOREPEAT) /* queue event */ wskbd_deliver_event(sc, sc->sc_repeat_type, sc->sc_repeat_value); #endif /* defined(WSKBD_EVENT_AUTOREPEAT) */ } callout_schedule(&sc->sc_repeat_ch, mstohz(sc->sc_keyrepeat_data.delN)); splx(s); }
void wskbd_input(device_t dev, u_int type, int value) { struct wskbd_softc *sc = device_private(dev); #if NWSDISPLAY > 0 int num, i; #endif if (sc->sc_repeating) { sc->sc_repeating = 0; callout_stop(&sc->sc_repeat_ch); } device_active(dev, DVA_HARDWARE); #if NWSDISPLAY > 0 /* * If /dev/wskbdN is not connected in event mode translate and * send upstream. */ if (sc->sc_translating) { num = wskbd_translate(sc->id, type, value); if (num > 0) { if (sc->sc_base.me_dispdv != NULL) { #ifdef WSDISPLAY_SCROLLSUPPORT if (sc->id->t_symbols [0] != KS_Print_Screen) { wsdisplay_scroll(sc->sc_base. me_dispdv, WSDISPLAY_SCROLL_RESET); } #endif for (i = 0; i < num; i++) wsdisplay_kbdinput( sc->sc_base.me_dispdv, sc->id->t_symbols[i]); } if (sc->sc_keyrepeat_data.del1 != 0) { sc->sc_repeating = num; callout_schedule(&sc->sc_repeat_ch, mstohz(sc->sc_keyrepeat_data.del1)); } } return; } #endif wskbd_deliver_event(sc, type, value); #if defined(WSKBD_EVENT_AUTOREPEAT) /* Repeat key presses if set. */ if (type == WSCONS_EVENT_KEY_DOWN && sc->sc_keyrepeat_data.del1 != 0) { sc->sc_repeat_type = type; sc->sc_repeat_value = value; sc->sc_repeating = 1; callout_schedule(&sc->sc_repeat_ch, mstohz(sc->sc_keyrepeat_data.del1)); } #endif /* defined(WSKBD_EVENT_AUTOREPEAT) */ }
void wskbd_rawinput(device_t dev, u_char *tbuf, int len) { #if NWSDISPLAY > 0 struct wskbd_softc *sc = device_private(dev); int i; if (sc->sc_base.me_dispdv != NULL) for (i = 0; i < len; i++) wsdisplay_kbdinput(sc->sc_base.me_dispdv, tbuf[i]); /* this is KS_GROUP_Plain */ #endif }