Hello, Anton Zinoviev, le Thu 05 Feb 2009 14:58:46 +0200, a écrit : > On Thu, Feb 05, 2009 at 12:39:08PM +0100, Samuel Thibault wrote: > > > > I don't have the time to develop right now, but the idea would then be > > to double the number of keymaps to 128, to have "capsed" versions of > > each of the current keycode translations. > > A good idea. :)
Thanks for having implemented it! Just an additional needed fixup: with the current svn, capitalization of non-ascii letters does not work for two reasons: - one needs to use locales to get locale-specific capitalization (e.g. in turkish, capitalization of i is not I but an I with dot above). - for compatibility reasons, when chr() is given a value between 0 and 0xff, it builds an 8bit char, not a unicode char. The problem is that uc() then does not work in UTF-8 locales. Using pack("U",...) always produces a unicode char. See attached patch. Samuel
Index: ckbcomp =================================================================== --- ckbcomp (révision 57763) +++ ckbcomp (copie de travail) @@ -19,6 +19,7 @@ use warnings 'all'; use strict; +use locale; my $debug_flag = 1; sub debug { @@ -3149,7 +3150,7 @@ # warning "Forbidden Unicode \"U+$kernelkeysym\"\n"; return 'VoidSymbol'; } else { - if (chr($uni) =~ /\p{IsAlpha}/) { + if (pack("U", $uni) =~ /\p{IsAlpha}/) { my $legacy = uni_to_legacy ($uni); if ($legacy ne 'VoidSymbol') { return '+'. $legacy; @@ -3589,8 +3590,8 @@ for my $mask (0 .. 63) { if ($capsvector[$mask] =~ /^(\+?)U\+([0-9a-fA-F]+)$/) { my $v = hex ($2); - my $l = ord (lc (chr ($v))); - my $u = ord (uc (chr ($v))); + my $l = ord (lc (pack ("U", $v))); + my $u = ord (uc (pack ("U", $v))); my $c = ($v == $l ? $u : $l); $capsvector[$mask] = $1 ."U+". sprintf ("%04x", $c); if ($v != $c && $v gt 0x7f) {