Page MenuHomeFreeBSD

D38381.id116656.diff
No OneTemporary

D38381.id116656.diff

diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c
--- a/sys/dev/adb/adb_kbd.c
+++ b/sys/dev/adb/adb_kbd.c
@@ -798,6 +798,7 @@
case OPIO_KEYMAP:
case PIO_KEYMAPENT:
case PIO_DEADKEYMAP:
+ case OPIO_DEADKEYMAP:
default:
return (genkbd_commonioctl(kbd, cmd, data));
}
diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c
--- a/sys/dev/atkbdc/atkbd.c
+++ b/sys/dev/atkbdc/atkbd.c
@@ -1091,6 +1091,7 @@
case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
state->ks_accents = 0;
/* FALLTHROUGH */
default:
diff --git a/sys/dev/gpio/gpiokeys.c b/sys/dev/gpio/gpiokeys.c
--- a/sys/dev/gpio/gpiokeys.c
+++ b/sys/dev/gpio/gpiokeys.c
@@ -899,6 +899,7 @@
case PIO_KEYMAPENT: /* set keyboard translation table
* entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
sc->sc_accents = 0;
/* FALLTHROUGH */
default:
diff --git a/sys/dev/hid/hkbd.c b/sys/dev/hid/hkbd.c
--- a/sys/dev/hid/hkbd.c
+++ b/sys/dev/hid/hkbd.c
@@ -1640,6 +1640,7 @@
case PIO_KEYMAPENT: /* set keyboard translation table
* entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
sc->sc_accents = 0;
/* FALLTHROUGH */
default:
diff --git a/sys/dev/hyperv/input/hv_kbd.c b/sys/dev/hyperv/input/hv_kbd.c
--- a/sys/dev/hyperv/input/hv_kbd.c
+++ b/sys/dev/hyperv/input/hv_kbd.c
@@ -666,6 +666,7 @@
case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
sc->sc_accents = 0;
/* FALLTHROUGH */
default:
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c
--- a/sys/dev/kbd/kbd.c
+++ b/sys/dev/kbd/kbd.c
@@ -790,6 +790,8 @@
{
keymap_t *mapp;
okeymap_t *omapp;
+ accentmap_t *accentmapp;
+ oaccentmap_t *oaccentmapp;
keyarg_t *keyp;
fkeyarg_t *fkeyp;
int i, j;
@@ -898,16 +900,58 @@
#endif
case GIO_DEADKEYMAP: /* get accent key translation table */
- bcopy(kbd->kb_accentmap, arg, sizeof(*kbd->kb_accentmap));
+ error = copyout(kbd->kb_accentmap, *(void **)arg,
+ sizeof(accentmap_t));
+ return (error);
+ break;
+ case OGIO_DEADKEYMAP: /* get accent key translation table (compat) */
+ accentmapp = kbd->kb_accentmap;
+ oaccentmapp = (oaccentmap_t *)arg;
+ oaccentmapp->n_accs = accentmapp->n_accs;
+ for (i = 0; i < NUM_DEADKEYS; i++) {
+ oaccentmapp->acc[i].accchar =
+ accentmapp->acc[i].accchar;
+ for (j = 0; j < NUM_ACCENTCHARS; j++) {
+ oaccentmapp->acc[i].map[j][0] =
+ accentmapp->acc[i].map[j][0];
+ oaccentmapp->acc[i].map[j][1] =
+ accentmapp->acc[i].map[j][1];
+ }
+ }
break;
+
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
#ifndef KBD_DISABLE_KEYMAP_LOAD
- error = accent_change_ok(kbd->kb_accentmap,
- (accentmap_t *)arg, curthread);
+ accentmapp = malloc(sizeof(*accentmapp), M_TEMP, M_WAITOK);
+ if (cmd == OPIO_DEADKEYMAP) {
+ oaccentmapp = (oaccentmap_t *)arg;
+ accentmapp->n_accs = oaccentmapp->n_accs;
+ for (i = 0; i < NUM_DEADKEYS; i++) {
+ for (j = 0; j < NUM_ACCENTCHARS; j++) {
+ accentmapp->acc[i].map[j][0] =
+ oaccentmapp->acc[i].map[j][0];
+ accentmapp->acc[i].map[j][1] =
+ oaccentmapp->acc[i].map[j][1];
+ accentmapp->acc[i].accchar =
+ oaccentmapp->acc[i].accchar;
+ }
+ }
+ } else {
+ error = copyin(*(void **)arg, accentmapp, sizeof(*accentmapp));
+ if (error != 0) {
+ free(accentmapp, M_TEMP);
+ return (error);
+ }
+ }
+
+ error = accent_change_ok(kbd->kb_accentmap, accentmapp, curthread);
if (error != 0) {
+ free(accentmapp, M_TEMP);
return (error);
}
- bcopy(arg, kbd->kb_accentmap, sizeof(*kbd->kb_accentmap));
+ bcopy(accentmapp, kbd->kb_accentmap, sizeof(*kbd->kb_accentmap));
+ free(accentmapp, M_TEMP);
break;
#else
return (ENODEV);
diff --git a/sys/dev/kbdmux/kbdmux.c b/sys/dev/kbdmux/kbdmux.c
--- a/sys/dev/kbdmux/kbdmux.c
+++ b/sys/dev/kbdmux/kbdmux.c
@@ -1243,6 +1243,7 @@
case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
KBDMUX_LOCK(state);
state->ks_accents = 0;
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -1598,6 +1598,8 @@
case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case GIO_DEADKEYMAP: /* get accent key translation table */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OGIO_DEADKEYMAP: /* get accent key translation table (compat) */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
case GETFKEY: /* get function key string */
case SETFKEY: /* set function key string */
error = kbdd_ioctl(sc->kbd, cmd, data);
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -1862,6 +1862,7 @@
case PIO_KEYMAPENT: /* set keyboard translation table
* entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
sc->sc_accents = 0;
/* FALLTHROUGH */
default:
diff --git a/sys/dev/vkbd/vkbd.c b/sys/dev/vkbd/vkbd.c
--- a/sys/dev/vkbd/vkbd.c
+++ b/sys/dev/vkbd/vkbd.c
@@ -1207,6 +1207,7 @@
case OPIO_KEYMAP: /* set keyboard translation table (compat) */
case PIO_KEYMAPENT: /* set keyboard translation table entry */
case PIO_DEADKEYMAP: /* set accent key translation table */
+ case OPIO_DEADKEYMAP: /* set accent key translation table (compat) */
state->ks_accents = 0;
/* FALLTHROUGH */
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -2403,7 +2403,9 @@
case GIO_KEYMAP:
case PIO_KEYMAP:
case GIO_DEADKEYMAP:
+ case OGIO_DEADKEYMAP:
case PIO_DEADKEYMAP:
+ case OPIO_DEADKEYMAP:
case GETFKEY:
case SETFKEY:
case KDGKBINFO:
diff --git a/sys/sys/kbio.h b/sys/sys/kbio.h
--- a/sys/sys/kbio.h
+++ b/sys/sys/kbio.h
@@ -199,8 +199,8 @@
#define ACC(x) ((x)+F_ACC)
struct acc_t {
- u_char accchar;
- u_char map[NUM_ACCENTCHARS][2];
+ u_int accchar;
+ u_int map[NUM_ACCENTCHARS][2];
};
struct accentmap {
@@ -209,6 +209,19 @@
};
typedef struct accentmap accentmap_t;
+#ifdef _KERNEL
+struct oacc_t {
+ u_char accchar;
+ u_char map[NUM_ACCENTCHARS][2];
+};
+
+struct oaccentmap {
+ u_short n_accs;
+ struct oacc_t acc[NUM_DEADKEYS];
+};
+typedef struct oaccentmap oaccentmap_t;
+#endif /* _KERNEL */
+
struct keyarg {
u_short keynum;
struct keyent_t key;
@@ -241,8 +254,13 @@
#define OGIO_KEYMAP _IOR('k', 6, okeymap_t)
#define OPIO_KEYMAP _IOW('k', 7, okeymap_t)
#endif /* _KERNEL */
-#define GIO_DEADKEYMAP _IOR('k', 8, accentmap_t)
-#define PIO_DEADKEYMAP _IOW('k', 9, accentmap_t)
+/* XXX: Should have accentmap_t as an argument, but that's too big for ioctl()! */
+#define GIO_DEADKEYMAP _IO('k', 8)
+#define PIO_DEADKEYMAP _IO('k', 9)
+#ifdef _KERNEL
+#define OGIO_DEADKEYMAP _IOR('k', 8, oaccentmap_t)
+#define OPIO_DEADKEYMAP _IOW('k', 9, oaccentmap_t)
+#endif /* _KERNEL */
#define GIO_KEYMAPENT _IOWR('k', 10, keyarg_t)
#define PIO_KEYMAPENT _IOW('k', 11, keyarg_t)

File Metadata

Mime Type
text/plain
Expires
Sun, Apr 27, 6:00 PM (5 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17817249
Default Alt Text
D38381.id116656.diff (7 KB)

Event Timeline