I was having the same problem and asked it over on AskUbuntu.
The issue can be solved by:
setting the preserve parameter
edit /usr/share/X11/xkb/types/iso9995
and add preserve[Shift+LevelThree] = Shift;
such that the contents of the file looks like:
partial default xkb_types "default" {
// A key type which can be used to implement
// an ISO9995-style level-three shift.
virtual_modifiers LevelThree;
type "THREE_LEVEL" {
modifiers = Shift+LevelThree;
map[None] = Level1;
map[Shift] = Level2;
map[LevelThree] = Level3;
map[Shift+LevelThree] = Level3;
preserve[Shift+LevelThree] = Shift;
level_name[Level1] = "Base";
level_name[Level2] = "Shift";
level_name[Level3] = "Level3";
};
};
customize the symbols file for the desired layout
Edit the keyboard layout file in /usr/share/X11/xkb/symbols/
as following (adapting to your own needs)
key <AC06> { type="THREE_LEVEL", [ h, H, Left ] };
key <AC07> { type="THREE_LEVEL", [ j, J, Down ] };
key <AC08> { type="THREE_LEVEL", [ k, K, Up ] };
key <AC09> { type="THREE_LEVEL", [ l, L, Right ] };
and not like
....
key { [ j, J, Down, Down ] };
....