386
-
Vstupní zařízení
-
Klávesnice
-
Item 4662
Otázka
Mám takový problém a potřeboval bych vědět, jestli se s tím někdo potýká taky, případně jestli ho vyřešil.
Mám nainstalovaný RH8, locale nastavené na cs_CZ:UTF8 klávesová mapa v konzoli je cz-lat2 a mapa v xwindows je cz. Všechny české znaky, které jsou přímo na klávesnici, tj. na klávesách 1-0 fungují bez problémů, ale nefungují mrtvé klávesy. Na textové konzoli nefungují vůbec, v xwindows jsou problémy hlavně s háčkem, nelze napsat třeba znaky ň, ť, ď, atd. Systém mrtvou klávesu jakoby akceptuje ale po zmáčknutí dalšího znaku, třeba n, se nenapíše nic.
Kdybyste věděli někdo co s tím, ozvěte se prosím.


Odpovědi
Ještě upřesnění: pod XWindows používám GNOME
Ako mate nastavene locales - premenne LC_* ?
LC_CTYPE musi byt nastavene na sk_SK (ehm, cz_CZ :)
Gnome-2.0 mělo ve starších verzích chybu a neznalo české mrtvé klávesy (tuším až do gtk-2.0.7). Samostatný patch je zde.
V textové konzoli to nechodí a zřejmě ještě nějakou dobu chodit nebude. Patch je zde (pozor, porušíte tím binární kompatibilitu jádra):
diff -Nurd linux.orig/drivers/char/keyboard.c linux/drivers/char/keyboard.c
--- linux.orig/drivers/char/keyboard.c Mon Oct 16 21:58:51 2000
+++ linux/drivers/char/keyboard.c Fri Sep 21 17:58:10 2001
@@ -151,7 +151,7 @@
/* N.B. drivers/macintosh/mac_keyb.c needs to call put_queue */
void put_queue(int);
-static unsigned char handle_diacr(unsigned char);
+static ushort handle_diacr(unsigned char);
/* kbd_pt_regs - set by keyboard_interrupt(), used by show_ptregs() */
struct pt_regs * kbd_pt_regs;
@@ -541,12 +541,24 @@
static void do_self(unsigned char value, char up_flag)
{
+ ushort v;
if (up_flag)
return; /* no action, if this is a key release */
- if (diacr)
- value = handle_diacr(value);
-
+ if (diacr) {
+ v = handle_diacr(value);
+ if (kbd->kbdmode == VC_UNICODE) {
+ to_utf8(v & 0xFFFF);
+ return;
+ }
+
+ /*
+ * this makes at least latin-1 compose chars work
+ * even when using unicode keymap in non-unicode mode
+ */
+ value = v & 0xFF;
+
+ }
if (dead_key_next) {
dead_key_next = 0;
diacr = value;
@@ -582,18 +594,18 @@
if (up_flag)
return;
- diacr = (diacr ? handle_diacr(value) : value);
+ diacr = (diacr ? (handle_diacr(value) & 0xFF) : value);
}
/*
* We have a combining character DIACR here, followed by the character CH.
- * If the combination occurs in the table, return the corresponding value.
+ * If the combination occurs in the table, return the corresponding UCS2 value.
* Otherwise, if CH is a space or equals DIACR, return DIACR.
* Otherwise, conclude that DIACR was not combining after all,
* queue it and return CH.
*/
-unsigned char handle_diacr(unsigned char ch)
+ushort handle_diacr(unsigned char ch)
{
int d = diacr;
int i;
diff -Nurd linux.orig/include/linux/kd.h linux/include/linux/kd.h
--- linux.orig/include/linux/kd.h Sat Jun 24 06:31:24 2000
+++ linux/include/linux/kd.h Fri Sep 21 17:52:54 2001
@@ -115,7 +115,8 @@
#define KDSKBSENT 0x4B49 /* sets one function key string entry */
struct kbdiacr {
- unsigned char diacr, base, result;
+ unsigned char diacr, base;
+ unsigned short int result; /* holds UCS2 value */
};
struct kbdiacrs {
unsigned int kb_cnt; /* number of entries in following array */
|