My researches had led me to the statements, that the way xmodmap specifies the 
keycode and
modifier combinations isn't flexible enough to describe modern Keyboards and 
the symbols that
are produced from them.

I assume its the "XKEYBOARD" X Server Extension that configures the keyboard 
through xkb files,
that should live somewhere near /usr/share/X11/xkb (system dependent).

To view your current configuration the command

        xkbcomp -xkb :0 - # produces a lot of output

. The files that affect this configuration can be found if you check the output 
of

        setxkbmap -print

. For example on my system that is

        xkb_keymap {
                xkb_keycodes  { include "evdev+aliases(qwertz)" };
                xkb_types        { include "complete"   };
                xkb_compat      { include "complete"    };
                xkb_symbols   { include "pc+de(nodeadkeys)+inet(evdev)" };
                xkb_geometry  { include "pc(pc104)"     };
        };

. When I want to find the produced symbols for that configuration I have to 
read the files
"symbols/pc", "symbols/de" and "symbols/inet". From the above output I can 
search the line
starting with 

        xkb_symbols "pc+de(nodeadkeys)+inet(evdev)"

. Each key on the keyboard is configured in such structure similar to

        key <AD01> {
                type= "FOUR_LEVEL_SEMIALPHABETIC",
                symbols[Group1]= [                         q,                   
   Q,                     at,    Greek_OMEGA ]
        };

. The term "<AD01>" comes from the xkb_geometry files and is evaluated as

        <AD01> = 24;

here, so that is for keycode 24.

The interesting thing is the "type" field, that comes from the 
"compat/complete" file
here and contains the structure

        type "FOUR_LEVEL_SEMIALPHABETIC" {
                modifiers= Shift+Lock+LevelThree;
                map[Shift]= Level2;
                map[Lock]= Level2;
                map[LevelThree]= Level3;
                map[Shift+LevelThree]= Level4;
                map[Lock+LevelThree]= Level3;
                preserve[Lock+LevelThree]= Lock;
                map[Shift+Lock+LevelThree]= Level4;
                preserve[Shift+Lock+LevelThree]= Lock;
                level_name[Level1]= "Base";
                level_name[Level2]= "Shift";
                level_name[Level3]= "Alt Base";
                level_name[Level4]= "Shift Alt";
        };

. Don't let be confused from the "level_name" Alt, that contains no or even 
misleading information.
We need to search for the term "LevelThree", that is overdefined as

        interpret ISO_Level3_Shift+AnyOf(all) {
                virtualModifier= LevelThree;
                useModMapMods=level1;
                action= SetMods(modifiers=LevelThree,clearLocks);
        };
        interpret ISO_Level3_Shift+AnyOfOrNone(all) {
                action= SetMods(modifiers=LevelThree,clearLocks);
        };

and "ISO_Level3_Shift" is

        <LVL3> = 92;
        key <LVL3> {
                type= "ONE_LEVEL",
                symbols[Group1]= [ ISO_Level3_Shift ]
        };

. I haven't found why my keyboard produces keycode 92 for AltGr, though the 
layout
uses "<RALT> = 108;" so it should produce 108.

I leave that last question for anyone who knows even more.

After all I would say that the xkb configuration is too complex and bad 
documented, but
understandable in the end.

I would recommend to forget about xmodmap and use xkbcomp(1) and setxkbmap(1) to
temporarily modify the produced symbols. You can define more than FOUR_LEVEL 
symbols. I found
definitions with up to EIGHT_LEVEL types. Can you define even more?

Another left-over question is: Is there a default or configured "system 
directory" to overwrite
the "installation directory" settings in "/usr/share/X11/xkb", such as 
"/etc/X11/xkb"?

Regards,

Ingo Krabbe


> Regarding the ayer's discussion, it pop'ed up a small question re/ xmodmap;
> 
> if I do:
> 
> $ xmodmap -pke | fgrep ' 24 ='
> keycode  24 = q Q q Q at Greek_OMEGA at Greek_OMEGA
> 
> I see that the at-sign in my environment is assigned as the 5th keysym
> to the keycode 24 and Alt-gr q gives @, even more Alt-gr Shift q gives
> the Greek_OMEGA: ΩΩΩΩΩΩΩ (perhaps you need an UTF-8 terminal to see it
> correctly). So far so good. But why the man page of xmodmap(1) says:
> 
>               keycode NUMBER = KEYSYMNAME ...
>                               The list of keysyms is assigned to the 
> indicated keycode (which
>                               may be specified in decimal, hex or octal and 
> can be determined
>                               by running the xev program).  Up to eight 
> keysyms may be
>                               attached to a key, however the last four are 
> not used in any
>                               major X server implementation.  The first 
> keysym is used when
>                               no modifier key is pressed in conjunction with 
> this key, the
>                               second with Shift, the third when the 
> Mode_switch key is used
>                               with this key and the fourth when both the 
> Mode_switch and
>                               Shift keys are used.
> 
> i.e. it says that four last values are unused? This is on my system with
> xorg-7.7 on FreeBSD 11-CURRENT.
> 
> Thanks
> 
>       matthias
> -- 
> Matthias Apitz, g...@unixarea.de, http://www.unixarea.de/ +49-170-4527211     
> +49-176-38902045
> "Wenn der Mensch von den Umständen gebildet wird, so muß man die Umstände 
> menschlich bilden."
> "Si el hombre es formado por las circunstancias entonces es necesario formar 
> humanamente
> las circunstancias", Karl Marx in Die heilige Familie / La sagrada familia 
> (MEW 2, 138)
> _______________________________________________
> xorg@lists.x.org: X.Org support
> Archives: http://lists.freedesktop.org/archives/xorg
> Info: http://lists.x.org/mailman/listinfo/xorg
> Your subscription address: %(user_address)s


_______________________________________________
xorg@lists.x.org: X.Org support
Archives: http://lists.freedesktop.org/archives/xorg
Info: http://lists.x.org/mailman/listinfo/xorg
Your subscription address: %(user_address)s

Reply via email to