Subject: Re: bug#4948: Dead key misery

From: Daniel Pfeiffer <[email-masked]>
Date: Fri, 20 Nov 2009 00:01:50 +0100

Hi Stefan,

la 11/17/2009 11:22 PM Stefan Monnier skribis:
>> ** Dead-key and composite character processing is done in the standard
>> X11R6 manner (through the default "input method" using the
>> /usr/lib/X11/locale/*/Compose databases of key combinations).  I.e. if
>> it works in xterm, it should also work in Emacs now.
>> This has long since stopped working.
>>     
>
> I don't use dead keys, but I use the compose key extensively, and it
> works just fine in my Emacs.  Can you give more detail to try and
> reproduce your problem?
>   
what details, I don't really know.  It might be Ubuntu specific, because 
it appeared long ago when I switched from SuSE to Ubuntu.  At the time I 
figured it must have to do with a newer Emacs, because xterm and all Gtk 
and Qt apps had and have no problem.  Sorry I didn't report it then, I 
guess this is two years back.

I think compose is not pertinent, because IMHO that does the combining 
in the X-server and sends the combined char, as though you had a key for 
it, like German äöüß is no problem even without loading iso-transl.

I'm attaching my very personal keymap (which covers my normal German 
external keyboard, the built in American one, with Z and Y switched 
German style and Esperanto letters).  I've stuffed in all dead-keys, 
like AltGr-, for cedilla,  AltGr-Shift-, for ogonek and AltGr-^ for 
circumflex.  I load it with xkbcomp -xkb .X/keymap/daniel $DISPLAY, but 
you could just as well just set one dead key with xmodmap IIRC.

coralament / best Grötens / liebe Grüße / best regards / elkorajn salutojn
Daniel Pfeiffer

-- 
lerne / learn / apprends / lär dig / ucz się    Esperanto:
                    http://lernu.net  /  http://ikurso.net

// -*- mode: c; compile-command: "exec xkbcomp -w3 daniel.xkb keymap/daniel" -*-
// setxkbmap 'us(euro)+level3(ralt_switch)'; setxkbmap 'us(euro)+level3(ralt_switch)' -print | xkbcomp -xkb - notebook-orig.xkb
// xkbcomp -xkb keymap/daniel -; xkbcomp -xkb keymap/daniel $DISPLAY; xkbcomp -xkb :0 -
// s ln -s ~/.X/keymap/daniel /usr/share/X11/xkb/keymap/

//	/usr/share/X11/XKeysymDB
//	/usr/include/X11/keysymdef.h
//	/usr/include/X11/XF86keysym.h
//	/usr/share/X11/locale/compose.dir
//	/usr/share/X11/locale/en_US.UTF-8/Compose

// In /etc/X11/xorg.conf ersetze
//	Option		"XkbKeymap"	"daniel"

xkb_keymap {
xkb_keycodes {
    //include "xfree86+aliases(qwertz)"
    include "evdev+aliases(qwertz)"
    virtual indicator 4 = "Group 1";
};

xkb_types {
    include "complete"
    type "HYPER+ALT" {
	modifiers= mod4+Alt;
	map[mod4+Alt]= Level2;
	level_name[Level1]= "Base";
	level_name[Level2]= "Hyper+Alt";
    };
};

xkb_compatibility {
    include "complete"
    indicator "Group 1" {
        !allowExplicit;
        groups= 0xfd;
    };
};

xkb_symbols "pc+us(euro)+level3(ralt_switch)" {

    name[group1] = "de";
    name[group2] = "us(euro)";

    key <XFER> { [ XF86AudioMedia       ] };
    key  <I20> { [ XF86AudioMute        ] };
    key  <I2E> { [ XF86AudioLowerVolume	] };
    key  <I30> { [ XF86AudioRaiseVolume ] };
    key  <I10> { [ XF86AudioPrev        ] };
    key  <I19> { [ XF86AudioNext        ] };
    key  <I22> { [ XF86AudioPlay, XF86AudioPause ] };
    key  <I24> { [ XF86AudioStop, XF86Eject ] };

    key  <I69> { [ XF86Forward          ] };
    key  <I6A> { [ XF86Back             ] };
    key <II65> { [ XF86KbdBrightnessDown ] };
    key  <I54> { [ XF86KbdBrightnessUp	] };
    key  <I5F> { [ XF86Standby		] };
    key  <I6C> { [ XF86Mail		] };
    key  <I32> { [ XF86HomePage         ] };
    key  <I65> { [ XF86Search           ] };
    key  <I66> { [ XF86Favorites        ] };

    key  <ESC> { [          Escape ] };
    key <BKSP> { [       BackSpace ] };
    key  <TAB> { [             Tab,    ISO_Left_Tab ] };
    key <RTRN> { [          Return ] };

    key <LCTL> { [       Control_L ] };
    key <LFSH> { [         Shift_L ] };

    key <RTSH> { [         Shift_R ] };
    key <LALT> { [           Alt_L,          Meta_L ] };
    key <SPCE> { [           space,           space,    nobreakspace ],
		 [           space,           space,    nobreakspace ],
		 [] };
    key <CAPS> { [       Caps_Lock ] };

    key <NMLK> { [        Num_Lock, Pointer_EnableKeys ] };
    key <SCLK> { [     Scroll_Lock ] };
    key  <KP7> { [         KP_Home,            KP_7 ] };
    key  <KP8> { [           KP_Up,            KP_8 ] };
    key  <KP9> { [        KP_Prior,            KP_9 ] };
    key  <KP4> { [         KP_Left,            KP_4 ] };
    key  <KP5> { [        KP_Begin,            KP_5 ] };
    key  <KP6> { [        KP_Right,            KP_6 ] };
    key  <KP1> { [          KP_End,            KP_1 ] };
    key  <KP2> { [         KP_Down,            KP_2 ] };
    key  <KP3> { [         KP_Next,            KP_3 ] };
    key  <KP0> { [       KP_Insert,            KP_0 ] };
    key <KPDL> { [       KP_Delete,      KP_Decimal ] };
    key <MDSW> { [     Mode_switch ] };

    key <HOME> { [            Home ] };
    key   <UP> { [              Up ] };
    key <PGUP> { [           Prior ] };
    key <LEFT> { [            Left ] };
    key <RGHT> { [           Right ] };
    key  <END> { [             End ] };
    key <DOWN> { [            Down ] };
    key <PGDN> { [            Next ] };
    key  <INS> { [          Insert ] };
    key <DELE> { [          Delete ] };
    key <KPEN> { [        KP_Enter ] };
    key <RCTL> { [       Control_R ] };
    key <PAUS> {
        type= "PC_CONTROL_LEVEL2",
        [           Pause,           Break ]
    };
    key <PRSC> {
        type= "PC_ALT_LEVEL2",
        [           Print,         Sys_Req ]
    };
    key <RALT> { [ ISO_Level3_Shift ] };
    key <LWIN> { [	    Hyper_L ] };
    key <RWIN> { [	    Hyper_R ] };
    key <MENU> { [  ISO_First_Group, ISO_Last_Group ] };
    key <LVL3> { [ ISO_Level3_Shift ] };
    key  <ALT> { [        NoSymbol,           Alt_L ] };
    key <KPEQ> { [        KP_Equal ] };
    key <SUPR> { [        NoSymbol,         Super_L ] };
    key <HYPR> { [        NoSymbol,         Hyper_L ] };
    key <META> { [        NoSymbol,          Meta_L ] };
    key <OUTP> { [     XF86Display ] };
    key <KITG> { [        NoSymbol ] };
    key <KIDN> { [        NoSymbol ] };
    key <KIUP> { [        NoSymbol ] };

    //key.type[group1] = "FOUR_LEVEL";
    key <TLDE> { [     asciicircum,	     degree, dead_circumflex,  dead_abovering ],
		 [           grave,      asciitilde,	  dead_grave,	   dead_tilde ] };
    key <AE01> { [               1,          exclam,	 onesuperior,	   exclamdown ],
		 [               1,          exclam,	 onesuperior,	   exclamdown ],
		 [] };
    key <AE02> { [		 2,        quotedbl,	 twosuperior,	      onehalf ],
		 [               2,              at,	 twosuperior,	      onehalf ] };
    key <AE03> { [		 3,	    section,   threesuperior,	     sterling ],
		 [               3,      numbersign,   threesuperior,	     sterling ] };
    key <AE04> { [               4,          dollar,	  onequarter,	     currency ],
		 [               4,          dollar,	  onequarter,	     currency ],
		 [] };
    key <AE05> { [               5,         percent,        EuroSign,     fiveeighths ],
		 [               5,         percent,        EuroSign,     fiveeighths ],
		 [] };
    key <AE06> { [		 6,	  ampersand,	     notsign ],
		 [               6,     asciicircum,         notsign, dead_circumflex ] };
    key <AE07> { [		 7,	      slash,	   braceleft,	 seveneighths ],
		 [               7,       ampersand,	    NoSymbol,	 seveneighths ] };
    key <AE08> { [		 8,	  parenleft,	 bracketleft ],
		 [               8,        asterisk,       oneeighth,	     multiply ] };
    key <AE09> { [		 9,	 parenright,	bracketright,	    plusminus ],
		 [               9,       parenleft ] };
    key <AE10> { [		 0,	      equal,	  braceright ],
		 [               0,      parenright,	      degree,  dead_abovering ] };
    key <AE11> { [	    ssharp,	   question,	   backslash,	 questiondown ],
		 [           minus,      underscore,	      emdash,	  dead_macron ] };
    key <AE12> { [	dead_acute,	 dead_grave,	  dead_breve,	   dead_caron ],
		 [           equal,            plus ] };

    key <LSGT> { [            less,         greater,             bar,       brokenbar ] };

    //key.type[group1] = "FOUR_LEVEL_ALPHABETIC";
    key <LatA> { [ a, A,		  ae,		   AE ],
		 [ a, A,		  ae,		   AE ],
		 [] };
    key <LatB> { [ b, B, rightdoublequotemark,	   apostrophe ],
		 [ b, B, rightdoublequotemark,	   apostrophe ],
		 [] };
    key <LatC> { [ c, C,	 ccircumflex,	  Ccircumflex ],
		 [ c, C,	 ccircumflex,	  Ccircumflex ],
		 [] };
    key <LatD> { [ d, D,		 eth,		  ETH ],
		 [ d, D,		 eth,		  ETH ],
		 [] };
    key <LatE> { [ e, E,	    EuroSign ],
		 [ e, E,	    EuroSign ],
		 [] };
    key <LatF> { [ f, F,	     dstroke,	  ordfeminine ],
		 [ f, F,	     dstroke,	  ordfeminine ],
		 [] };
    key <LatG> { [ g, G,	 gcircumflex,	  Gcircumflex ],
		 [ g, G,	 gcircumflex,	  Gcircumflex ],
		 [] };
    key <LatH> { [ h, H,	 hcircumflex,	  Hcircumflex ],
		 [ h, H,	 hcircumflex,	  Hcircumflex ],
		 [] };
    key <LatI> { [ i, I,	    idotless,	    Iabovedot ],
		 [ i, I,	    idotless,	    Iabovedot ],
		 [] };
    key <LatJ> { [ j, J,	 jcircumflex,	  Jcircumflex ],
		 [ j, J,	 jcircumflex,	  Jcircumflex ],
		 [] };
    key <LatK> { [ k, K,		 kra,	    ampersand ],
		 [ k, K,		 kra,	    ampersand ],
		 [] };
    key <LatL> { [ l, L,	     lstroke,	      Lstroke ],
		 [ l, L,	     lstroke,	      Lstroke ],
		 [] };
    key <LatM> { [ m, M,		  mu,	    masculine ],
		 [ m, M,		  mu,	    masculine ],
		 [] };
    key <LatN> { [ n, N,		 eng,		  ENG ],
		 [ n, N,		 eng,		  ENG ],
		 [] };
    key <LatO> { [ o, O,		  oe,		   OE ],
		 [ o, O,		  oe,		   OE ],
		 [] };
    key <LatP> { [ p, P,	       thorn,		THORN ],
		 [ p, P,	       thorn,		THORN ],
		 [] };
    key <LatQ> { [ q, Q,		  at,	  Greek_OMEGA ],
		 [ q, Q,		  at,	  Greek_OMEGA ],
		 [] };
    key <LatR> { [ r, R,	   trademark,	   registered ],
		 [ r, R,	   trademark,	   registered ],
		 [] };
    key <LatS> { [ s, S,	 scircumflex,	  Scircumflex ],
		 [ s, S,	 scircumflex,	  Scircumflex ],
		 [] };
    key <LatT> { [ t, T,	      tslash,	       Tslash ],
		 [ t, T,	      tslash,	       Tslash ],
		 [] };
    key <LatU> { [ u, U,	     ubreve,	       Ubreve ],
		 [ u, U,	     ubreve,	       Ubreve ],
		 [] };
    key <LatV> { [ v, V, leftdoublequotemark,		grave ],
		 [ v, V, leftdoublequotemark,		grave ],
		 [] };
    key <LatW> { [ w, W,	       U2C73,		U2C72 ],
		 [ w, W,	       U2C73,		U2C72 ],
		 [] };
    key <LatX> { [ x, X,      guillemotright ],
		 [ x, X,      guillemotright ],
		 [] };
    key <LatY> { [ y, Y,       guillemotleft,		  yen ],
		 [ y, Y,       guillemotleft,		  yen ],
		 [] };
    key <LatZ> { [ z, Z,	       U2C6C,		U2C6B ],
		 [ z, Z,	       U2C6C,		U2C6B ],
		 [] };

    //key.type[group1] = "EIGHT_LEVEL";

    key <AD11> { [	udiaeresis,	 Udiaeresis,	udoubleacute,	 Udoubleacute ],
		 [     bracketleft,       braceleft ] };
    key <AD12> { [	      plus,	   asterisk,	  asciitilde,	   dead_tilde ],
		 [    bracketright,      braceright ] };

    key <BKSL> { [	numbersign,	 apostrophe,	     NoSymbol,	        grave ],
		 [       backslash,             bar,	      ssharp,	    brokenbar ] };

    key <AC10> { [	odiaeresis,	 Odiaeresis,	 odoubleacute,	 Odoubleacute ],
		 [       semicolon,           colon ] };
    key <AC11> { [	adiaeresis,	 Adiaeresis, dead_diaeresis, dead_doubleacute ],
		 [      apostrophe,        quotedbl ] };

    key <AB08> { [	     comma,	  semicolon,	dead_cedilla,	  dead_ogonek ],
		 [           comma,            less,	dead_cedilla,	  dead_ogonek ] };
    key <AB09> { [	    period,	      colon,  periodcentered,	dead_abovedot ],
		 [          period,         greater,  periodcentered,	dead_abovedot ] };
    key <AB10> { [	     minus,	 underscore,	      emdash,	  dead_macron ],
		 [           slash,        question ] };

    key.type[group1] = "HYPER+ALT";
    key <FK01> { [          F1, XF86_Switch_VT_1 ] };
    key <FK02> { [          F2, XF86_Switch_VT_2 ] };
    key <FK03> { [          F3, XF86_Switch_VT_3 ] };
    key <FK04> { [          F4, XF86_Switch_VT_4 ] };
    key <FK05> { [          F5, XF86_Switch_VT_5 ] };
    key <FK06> { [          F6, XF86_Switch_VT_6 ] };
    key <FK07> { [          F7, XF86_Switch_VT_7 ] };
    key <FK08> { [          F8, XF86_Switch_VT_8 ] };
    key <FK09> { [          F9, XF86_Switch_VT_9 ] };
    key <FK10> { [         F10, XF86_Switch_VT_10 ] };
    key <FK11> { [         F11, XF86_Switch_VT_11 ] };
    key <FK12> { [         F12, XF86_Switch_VT_12 ] };
    key <KPMU> { [ KP_Multiply, XF86_ClearGrab ] };
    key <KPDV> { [   KP_Divide, XF86_Ungrab ] };
    key <KPSU> { [ KP_Subtract, XF86_Prev_VMode ] };
    key <KPAD> { [      KP_Add, XF86_Next_VMode ] };

    modifier_map Control { <LCTL>, <RCTL> };
    modifier_map Shift { <LFSH>, <RTSH> };
    modifier_map Lock { <CAPS> };
    modifier_map Mod1 { <LALT>, <META> };
    modifier_map Mod2 { <NMLK> };
    modifier_map Mod3 { <MENU> };
    modifier_map Mod4 { <LWIN>, <RWIN>, <SUPR>, <HYPR> };
    modifier_map Mod5 { <MDSW>, <LVL3>, <RALT> };
};

xkb_geometry { include "pc(pc105)" };
};