From nobody Mon Feb 6 23:01:57 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4P9hbV0m0Kz3nYCr; Mon, 6 Feb 2023 23:01:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4P9hbV0Df9z4MWK; Mon, 6 Feb 2023 23:01:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675724518; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=tgVUKNOYbB9FKccJK+wDRctAh371ZaNMYI8OTvF7Lg8=; b=y2OzxC0MENTdDF+osuy2KaVfH3wjG1aKAfwkJanr1TM1Ot1Y9JWq3T2FpGmD7ob4YPGS7f xmgFNp49S+8Htidn/QIv+wUqXGk6OZo3nnl2T+EEp/1VDQPo8UKB/jG38McDEQjXQHDzkK cDOWt7lgNh+rrBybgVPvFaNxdxogMwHIIq7ZfaEAV+6ADdz76Unk05v3GyJddPOWYuVgcP r6Ql/DcAbrBxanh6scausJgZ3434XoLpFt2dbCSawNCI0mFArLMydxvrXe8w5cMMxKTAQz 8gL37bGc6BeaVqh5Q+q8VS6H8NO5OnSm5+VyyCJEOC7ZpWJmTEESuUcm028E5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675724518; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=tgVUKNOYbB9FKccJK+wDRctAh371ZaNMYI8OTvF7Lg8=; b=vFpclP3svGfvdkBbhTNIwazeThBGiAb5qRPzJYkO1DkqXl81Y0i1VM7oKg6wY4iiGNuMaB 3qRtpoWDTqRDMwKD0RAwamkqZ6NuFLGJbw60ZmEQ2nCumxwhM7fMAWkQsYZ4ly3G0Ah0Xm zpc3Pxm7Fk5wMjn/+rs8FWL9blkzHDhx37BQS5qjNfJLbnPabo3Rqm0CrOqAYOp2AC60E1 t7FxdSpUfwK3UeRiAMAXozrKrdj7/gNpefm+wgn86AzEt/YUvWLZ7Tw6t+OpRHbRW6ak7h OAxLCR03ud4MoeQaFJhEmEzevC8D6pV5eFGz1dSuKRJtg7Kz4czOd5xv2QU8pw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1675724518; a=rsa-sha256; cv=none; b=LYri5i+OUjDPF2yLBVRdhzC29C2fvvl6g9XPAZALVzX8Ktt4Kxv8IMHwCYcLUiDmktXV+T 79wbVOkD6203XAPNdCv5aI62cNbIAciAq49PeMZ37tmBktL36xdytKpsmKlTN+d4X4Rcuv dVIGIfZWGAngUGMrXMeKvm7CNzXHdKN3ZPR2aZGM7aXYD4lJIrhLi7ioRsrG9mjpKqQMAQ jufnkIlBdmSKYXOgTV+v+VfeFkaXkOr/7+z0+/2JC6jC6rJg9RQxa1zSVAjfup5hYyrYiu yI3gAOfOgkbViw0j/hsQec0u1Jzl94rTGAEGzdJsptaUx9nhZvWfcYKBz992qg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4P9hbT6R0Rztdw; Mon, 6 Feb 2023 23:01:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 316N1vcH021428; Mon, 6 Feb 2023 23:01:57 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 316N1vfw021427; Mon, 6 Feb 2023 23:01:57 GMT (envelope-from git) Date: Mon, 6 Feb 2023 23:01:57 GMT Message-Id: <202302062301.316N1vfw021427@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Stefan=20E=C3=9Fer?= Subject: git: 4972fb927638 - main - Support Unicode characters in keymap dead key tables List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: se X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4972fb9276389fb87a790b415b1161cff395884c Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by se: URL: https://cgit.FreeBSD.org/src/commit/?id=4972fb9276389fb87a790b415b1161cff395884c commit 4972fb9276389fb87a790b415b1161cff395884c Author: Stefan Eßer AuthorDate: 2023-02-06 22:48:47 +0000 Commit: Stefan Eßer CommitDate: 2023-02-06 22:48:47 +0000 Support Unicode characters in keymap dead key tables Support for Unicode characters had been added to the keyboard code, but there are keymaps that have accented characters accessed via dead key combinations, and those were still restricted to 8 bit codes. This update to kbd.c adds support for Unicode characters and compatibility code that allows a kbdcontrol command built from kbio.h without these patches to work on a new kernel. Compatibility code that allows a new kbdcontrol binary running on an old kernel to load and display the dead key map will be committed in a separate commit. Reviewed by: imp, brooks Approved by: brooks MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D38381 --- sys/dev/adb/adb_kbd.c | 1 + sys/dev/atkbdc/atkbd.c | 1 + sys/dev/gpio/gpiokeys.c | 1 + sys/dev/hid/hkbd.c | 1 + sys/dev/hyperv/input/hv_kbd.c | 1 + sys/dev/kbd/kbd.c | 52 +++++++++++++++++++++++++++++++++++++++---- sys/dev/kbdmux/kbdmux.c | 1 + sys/dev/syscons/syscons.c | 2 ++ sys/dev/usb/input/ukbd.c | 1 + sys/dev/vkbd/vkbd.c | 1 + sys/dev/vt/vt_core.c | 2 ++ sys/sys/kbio.h | 26 ++++++++++++++++++---- 12 files changed, 82 insertions(+), 8 deletions(-) diff --git a/sys/dev/adb/adb_kbd.c b/sys/dev/adb/adb_kbd.c index 757b687da145..86d3865473bb 100644 --- a/sys/dev/adb/adb_kbd.c +++ b/sys/dev/adb/adb_kbd.c @@ -798,6 +798,7 @@ static int akbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t data) 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 index eb76882bf9f7..08266cf4bf51 100644 --- a/sys/dev/atkbdc/atkbd.c +++ b/sys/dev/atkbdc/atkbd.c @@ -1091,6 +1091,7 @@ atkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) 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 index 36746923f01b..655fd2f4e154 100644 --- a/sys/dev/gpio/gpiokeys.c +++ b/sys/dev/gpio/gpiokeys.c @@ -899,6 +899,7 @@ gpiokeys_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg) 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 index 09339a762679..a938ae70787b 100644 --- a/sys/dev/hid/hkbd.c +++ b/sys/dev/hid/hkbd.c @@ -1640,6 +1640,7 @@ hkbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg) 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 index ea1a8b883fbb..2e313b06ca7e 100644 --- a/sys/dev/hyperv/input/hv_kbd.c +++ b/sys/dev/hyperv/input/hv_kbd.c @@ -666,6 +666,7 @@ hvkbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg) 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 index deb7672de7fa..41d6fd5666d8 100644 --- a/sys/dev/kbd/kbd.c +++ b/sys/dev/kbd/kbd.c @@ -790,6 +790,8 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) { 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 @@ genkbd_commonioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) #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 index b70e956830e5..1545022bec2a 100644 --- a/sys/dev/kbdmux/kbdmux.c +++ b/sys/dev/kbdmux/kbdmux.c @@ -1243,6 +1243,7 @@ kbdmux_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) 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 index 6c349668410d..c456be43d8a4 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -1598,6 +1598,8 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) 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 index c8658f9b62da..e4ee63f59720 100644 --- a/sys/dev/usb/input/ukbd.c +++ b/sys/dev/usb/input/ukbd.c @@ -1862,6 +1862,7 @@ ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg) 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 index fdd244ec2525..27cf4549f3db 100644 --- a/sys/dev/vkbd/vkbd.c +++ b/sys/dev/vkbd/vkbd.c @@ -1207,6 +1207,7 @@ vkbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) 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 index 2827cc1c85a8..a47343340b0a 100644 --- a/sys/dev/vt/vt_core.c +++ b/sys/dev/vt/vt_core.c @@ -2403,7 +2403,9 @@ skip_thunk: 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 index 7f17bda76c51..daef8e474816 100644 --- a/sys/sys/kbio.h +++ b/sys/sys/kbio.h @@ -199,8 +199,8 @@ typedef struct okeymap okeymap_t; #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 @@ struct accentmap { }; 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 @@ typedef struct fkeyarg fkeyarg_t; #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)