Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 29 Jan 2023 16:10:31 +0100
From:      Yuri <yuri@aetern.org>
To:        Hans Petter Selasky <hps@selasky.org>, current@freebsd.org
Subject:   Re: vt and keyboard accents
Message-ID:  <37e0cdef-d3f9-e6d9-2368-5bff0bdbe6c1@aetern.org>
In-Reply-To: <ee7b6209-05d4-438c-87bb-b9273e4d778e@selasky.org>
References:  <70f53d17-46eb-c299-1a93-bf28858c1685@aetern.org> <c316280c-8dd8-b969-e623-9fcadab04dd1@selasky.org> <842fe9a7-ec72-7557-72b0-4054cf770a5d@aetern.org> <ee7b6209-05d4-438c-87bb-b9273e4d778e@selasky.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hans Petter Selasky wrote:
> On 1/29/23 09:48, Yuri wrote:
>> Hans Petter Selasky wrote:
>>> On 1/29/23 01:54, Yuri wrote:
>>>> Looking into an issue with accents input for vt and cz (so
>>>> /usr/share/vt/keymaps/cz.kbd) keyboard where some of the accents are
>>>> working and other result weird unrelated characters output.
>>>>
>>>> Checking kbdcontrol -d output, there is an obvious difference with
>>>> keymap contents -- all mappings are trimmed down to 1 byte after
>>>> reading:
>>>>
>>>> kbdcontrol:
>>>>     dacu  180  ( 180 180 ) ( 'S' 'Z' ) ( 'Z' 'y' ) ( 's' '[' )
>>>>                ( 'z' 'z' ) ( 'R' 'T' ) ( 'A' 193 ) ( 'L' '9' )
>>>>                ( 'C' 006 ) ( 'E' 201 ) ( 'I' 205 ) ( 'N' 'C' )
>>>>                ( 'O' 211 ) ( 'U' 218 ) ( 'Y' 221 ) ( 'r' 'U' )
>>>>                ( 'a' 225 ) ( 'l' ':' ) ( 'c' 007 ) ( 'e' 233 )
>>>>                ( 'i' 237 ) ( 'n' 'D' ) ( 'o' 243 ) ( 'u' 250 )
>>>>                ( 'y' 253 )
>>>>
>>>> keymap:
>>>>     dacu 0xb4    ( 0xb4   0xb4    ) ( 'S'    0x015a  ) ( 'Z'   
>>>> 0x0179  )
>>>> ( 's'    0x015b  )
>>>>                  ( 'z'    0x017a  ) ( 'R'    0x0154  ) ( 'A'   
>>>> 0xc1    )
>>>> ( 'L'    0x0139  )
>>>>                  ( 'C'    0x0106  ) ( 'E'    0xc9    ) ( 'I'   
>>>> 0xcd    )
>>>> ( 'N'    0x0143  )
>>>>                  ( 'O'    0xd3    ) ( 'U'    0xda    ) ( 'Y'   
>>>> 0xdd    )
>>>> ( 'r'    0x0155  )
>>>>                  ( 'a'    0xe1    ) ( 'l'    0x013a  ) ( 'c'   
>>>> 0x0107  )
>>>> ( 'e'    0xe9    )
>>>>                  ( 'i'    0xed    ) ( 'n'    0x0144  ) ( 'o'   
>>>> 0xf3    )
>>>> ( 'u'    0xfa    )
>>>>                  ( 'y'    0xfd    )
>>>>
>>>> Source of the problem is the following definition in sys/sys/kbio.h:
>>>>
>>>> struct acc_t {
>>>>           u_char          accchar;
>>>>           u_char          map[NUM_ACCENTCHARS][2];
>>>> };
>>>>
>>>> While the keymaps were converted to have the unicode characters for vt
>>>> in the commit below, the array to store them (map) was missed, or was
>>>> there a reason for this?
>>>>
>>>> ---
>>>> commit 7ba08f814546ece02e0193edc12cf6eb4d5cb8d4
>>>> Author: Stefan Eßer <se@FreeBSD.org>
>>>> Date:   Sun Aug 17 19:54:21 2014 +0000
>>>>
>>>>       Attempt at converting the SYSCONS keymaps to Unicode for use with
>>>> NEWCONS.
>>>>       I have spent many hours comparing source and destination formats,
>>>> and hope
>>>>       to have caught the most severe conversion errors.
>>>> ---
>>>>
>>>> I have tried the following patch and it allows me to enter all accents
>>>> documented in the keymap, though I must admit I'm not sure it does not
>>>> have hidden issues:
>>>>
>>>> diff --git a/sys/sys/kbio.h b/sys/sys/kbio.h
>>>> index 7f17bda76c5..fffeb63e226 100644
>>>> --- a/sys/sys/kbio.h
>>>> +++ b/sys/sys/kbio.h
>>>> @@ -200,7 +200,7 @@ typedef struct okeymap okeymap_t;
>>>>
>>>>    struct acc_t {
>>>>           u_char          accchar;
>>>> -       u_char          map[NUM_ACCENTCHARS][2];
>>>> +       int             map[NUM_ACCENTCHARS][2];
>>>>    };
>>>>
>>>
>>> Hi,
>>>
>>> Using "int" for unicode characters is probably good for now. Your patch
>>> looks good, but please also consider the "umlaut" case while at it
>>> (multiple characters that become one)!
>>
>> I think umlauts are already part of "accents" (duml keyword), e.g. in
>> cz.kbd:
>>
>>    duml 0xa8    ( 0xa8   0xa8    ) ( 'A'    0xc4    ) ( 'E'    0xcb    )
>> ( 'O'    0xd6    )
>>                 ( 'U'    0xdc    ) ( 'a'    0xe4    ) ( 'e'    0xeb    )
>> ( 'o'    0xf6    )
>>                 ( 'u'    0xfc    )
>>
>> So pressing Alt+Shift and "=/+" key, and then pressing one of AEOUaeou
>> keys would produce ÄËÖÜäëöü, respectively, and it currently works as all
>> of the ÄËÖÜäëöü characters can be written as single-byte unicode.
>>
>> And the following dcar (that is, "caron") characters are all broken as
>> they need at least 2 bytes, pressing Shift and "=/+" key, and any of the
>> LSTZlstzCEDNRcednrUu would print nothing at all, produce garbage, or
>> print some control character (last byte only):
>>
>>    dcar 0x02c7  ( 0x02c7 0x02c7  ) ( 'L'    0x013d  ) ( 'S'    0x0160  )
>> ( 'T'    0x0164  )
>>                 ( 'Z'    0x017d  ) ( 'l'    0x013e  ) ( 's'    0x0161  )
>> ( 't'    0x0165  )
>>                 ( 'z'    0x017e  ) ( 'C'    0x010c  ) ( 'E'    0x011a  )
>> ( 'D'    0x010e  )
>>                 ( 'N'    0x0147  ) ( 'R'    0x0158  ) ( 'c'    0x010d  )
>> ( 'e'    0x011b  )
>>                 ( 'd'    0x010f  ) ( 'n'    0x0148  ) ( 'r'    0x0159  )
>> ( 'U'    0x016e  )
>>                 ( 'u'    0x016f  )
> 
> Hi Yuri,
> 
> Do you happen to know if we currently support these Norwegian-only umlauts?
> 
> For example written as "umlauts":
> 
> å b̊ c̊
> 
> Only the single-characters å and Å are of interest in the Norwegian
> language.

Looking at the share/vt/keymaps/no.kbd we don't, but if I understood you
correctly and only å/Å are required, it should be easy to add:

diff --git a/share/vt/keymaps/no.kbd b/share/vt/keymaps/no.kbd
index 710563917fa4..94c3621396dc 100644
--- a/share/vt/keymaps/no.kbd
+++ b/share/vt/keymaps/no.kbd
@@ -33,7 +33,7 @@
   027   0xa8   '^'    rs     rs     '~'    '^'    rs     rs      O
   028   cr     cr     nl     nl     cr     cr     nl     nl      O
   029   lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl   O
-  030   'a'    'A'    soh    soh    0xe1   0xc1   soh    soh     C
+  030   'a'    'A'    soh    soh    0xe1   0xc1   0xe5   0xc5    C
   031   's'    'S'    dc3    dc3    0xdf   0xdf   dc3    dc3     C
   032   'd'    'D'    eot    eot    0xf0   0xd0   eot    eot     C
   033   'f'    'F'    ack    ack    0xaa   0xaa   ack    ack     C

Pressing Ctrl+AltGr+a will produce å now, with Shift for Å.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?37e0cdef-d3f9-e6d9-2368-5bff0bdbe6c1>