aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/vt/vt.h2
-rw-r--r--sys/dev/vt/vt_core.c69
2 files changed, 24 insertions, 47 deletions
diff --git a/sys/dev/vt/vt.h b/sys/dev/vt/vt.h
index da308cd035c4..ec939f2341cd 100644
--- a/sys/dev/vt/vt.h
+++ b/sys/dev/vt/vt.h
@@ -158,7 +158,7 @@ struct vt_device {
#define VDF_QUIET_BELL 0x80 /* Disable bell. */
#define VDF_SUSPENDED 0x100 /* Device has been suspended. */
#define VDF_DOWNGRADE 0x8000 /* The driver is being downgraded. */
- int vd_keyboard; /* (G) Keyboard index. */
+ struct keyboard *vd_keyboard; /* (G) Keyboard. */
unsigned int vd_kbstate; /* (?) Device unit. */
unsigned int vd_unit; /* (c) Device unit. */
int vd_altbrk; /* (?) Alt break seq. state */
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
index 78cd5d60b1cf..3d7eecdb1b10 100644
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -605,8 +605,7 @@ vt_window_switch(struct vt_window *vw)
/* Restore per-window keyboard mode. */
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL) {
+ if ((kbd = vd->vd_keyboard) != NULL) {
if (curvw->vw_kbdmode == K_XLATE)
vt_save_kbd_state(curvw, kbd);
@@ -982,7 +981,7 @@ vt_kbdevent(keyboard_t *kbd, int event, void *arg)
break;
case KBDIO_UNLOADING:
mtx_lock(&Giant);
- vd->vd_keyboard = -1;
+ vd->vd_keyboard = NULL;
kbd_release(kbd, (void *)vd);
mtx_unlock(&Giant);
return (0);
@@ -1039,19 +1038,14 @@ vt_allocate_keyboard(struct vt_device *vd)
DPRINTF(20, "%s: no kbdmux allocated\n", __func__);
idx0 = kbd_allocate("*", -1, vd, vt_kbdevent, vd);
if (idx0 < 0) {
- /*
- * We don't have a keyboard yet, so we must invalidate
- * vd->vd_keyboard so that later keyboard attachment can
- * succeed. Any value >= 0 can accidentally match a
- * keyboard.
- */
- vd->vd_keyboard = -1;
DPRINTF(10, "%s: No keyboard found.\n", __func__);
return (-1);
}
+ k0 = kbd_get_keyboard(idx0);
}
- vd->vd_keyboard = idx0;
- DPRINTF(20, "%s: vd_keyboard = %d\n", __func__, vd->vd_keyboard);
+ vd->vd_keyboard = k0;
+ DPRINTF(20, "%s: vd_keyboard = %d\n", __func__,
+ vd->vd_keyboard->kb_index);
if (vd->vd_curwindow == &vt_conswindow) {
for (i = 0; i < grabbed; ++i)
@@ -1540,8 +1534,7 @@ vtterm_cngetc(struct terminal *tm)
}
/* Stripped down keyboard handler. */
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd == NULL)
+ if ((kbd = vd->vd_keyboard) == NULL)
return (-1);
/* Force keyboard input mode to K_XLATE */
@@ -1617,8 +1610,7 @@ vtterm_cngrab(struct terminal *tm)
if (!cold)
vt_window_switch(vw);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd == NULL)
+ if ((kbd = vd->vd_keyboard) == NULL)
return;
if (vw->vw_grabbed++ > 0)
@@ -1648,8 +1640,7 @@ vtterm_cnungrab(struct terminal *tm)
vw = tm->tm_softc;
vd = vw->vw_device;
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd == NULL)
+ if ((kbd = vd->vd_keyboard) == NULL)
return;
if (--vw->vw_grabbed > 0)
@@ -2189,8 +2180,7 @@ skip_thunk:
error = 0;
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
error = kbdd_ioctl(kbd, cmd, data);
mtx_unlock(&Giant);
if (error == ENOIOCTL) {
@@ -2208,8 +2198,7 @@ skip_thunk:
if (vw == vd->vd_curwindow) {
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
error = vt_save_kbd_state(vw, kbd);
mtx_unlock(&Giant);
@@ -2234,8 +2223,7 @@ skip_thunk:
error = 0;
if (vw == vd->vd_curwindow) {
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
error = vt_update_kbd_state(vw, kbd);
mtx_unlock(&Giant);
}
@@ -2247,8 +2235,7 @@ skip_thunk:
if (vw == vd->vd_curwindow) {
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
error = vt_save_kbd_leds(vw, kbd);
mtx_unlock(&Giant);
@@ -2273,8 +2260,7 @@ skip_thunk:
error = 0;
if (vw == vd->vd_curwindow) {
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
error = vt_update_kbd_leds(vw, kbd);
mtx_unlock(&Giant);
}
@@ -2290,8 +2276,7 @@ skip_thunk:
if (vw == vd->vd_curwindow) {
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
error = vt_save_kbd_mode(vw, kbd);
mtx_unlock(&Giant);
@@ -2316,8 +2301,7 @@ skip_thunk:
error = 0;
if (vw == vd->vd_curwindow) {
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
error = vt_update_kbd_mode(vw, kbd);
mtx_unlock(&Giant);
}
@@ -2362,8 +2346,7 @@ skip_thunk:
if (vw == vd->vd_curwindow) {
mtx_lock(&Giant);
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd != NULL)
+ if ((kbd = vd->vd_keyboard) != NULL)
vt_save_kbd_state(vw, kbd);
mtx_unlock(&Giant);
}
@@ -2482,7 +2465,8 @@ skip_thunk:
case CONS_SETKBD: /* set the new keyboard */
mtx_lock(&Giant);
error = 0;
- if (vd->vd_keyboard != *(int *)data) {
+ if (vd->vd_keyboard == NULL ||
+ vd->vd_keyboard->kb_index != *(int *)data) {
kbd = kbd_get_keyboard(*(int *)data);
if (kbd == NULL) {
mtx_unlock(&Giant);
@@ -2491,13 +2475,11 @@ skip_thunk:
i = kbd_allocate(kbd->kb_name, kbd->kb_unit,
(void *)vd, vt_kbdevent, vd);
if (i >= 0) {
- if (vd->vd_keyboard != -1) {
- kbd = kbd_get_keyboard(vd->vd_keyboard);
+ if ((kbd = vd->vd_keyboard) != NULL) {
vt_save_kbd_state(vd->vd_curwindow, kbd);
kbd_release(kbd, (void *)vd);
}
- kbd = kbd_get_keyboard(i);
- vd->vd_keyboard = i;
+ kbd = vd->vd_keyboard = kbd_get_keyboard(i);
vt_update_kbd_mode(vd->vd_curwindow, kbd);
vt_update_kbd_state(vd->vd_curwindow, kbd);
@@ -2510,16 +2492,11 @@ skip_thunk:
case CONS_RELKBD: /* release the current keyboard */
mtx_lock(&Giant);
error = 0;
- if (vd->vd_keyboard != -1) {
- kbd = kbd_get_keyboard(vd->vd_keyboard);
- if (kbd == NULL) {
- mtx_unlock(&Giant);
- return (EINVAL);
- }
+ if ((kbd = vd->vd_keyboard) != NULL) {
vt_save_kbd_state(vd->vd_curwindow, kbd);
error = kbd_release(kbd, (void *)vd);
if (error == 0) {
- vd->vd_keyboard = -1;
+ vd->vd_keyboard = NULL;
}
}
mtx_unlock(&Giant);