ok, I made some debug messages in the CS code and found something out. I can't write a patch because I don't have enough understanding of all code correlations but with my info I hope it should be easy enough for someone with this understanding to write a patch.
The X eventhandling is ok until that piece of code:
plugins/video/canvas/xwindow/xwindow.cpp, line 690 - 698:
if (xKey < sizeof(ScanCodeToChar)/sizeof(ScanCodeToChar))
csKeyRaw = ScanCodeToChar [xKey];
// @@@ Remove scancodes, if possible
csKeyCooked = charcount == 1 ? charcode : 0;
This is the place where regular keys are handled.
"default" is being entered when I push an umlaut, but the "if" isn't.
This is why:
ä xKey: 228
ö xKey: 246
ü xKey: 252
ß xKey: 223
Ä xKey: 196
Ö xKey: 214
Ü xKey: 220
but include/csplugincommon/canvas/scancode.h, line 32:
extern CS_CRYSTALSPACE_EXPORT unsigned short ScanCodeToChar ;
-> the xKeys for the special chars are bigger than ScanCodeToChar, that's the reason why they are not handled by CS.
ASCII has 128 chars, Latin-1 has 256, but for unicode this should be 65.536 (UCS-2, 16 Bit) or 1.114.112 (UCS-4, 32 Bit)
Further I noticed that charcount is 0 with Metakeys like Shift..., 1 with regular alphanum keys and 2 with äöüßÄÖÜ.
charcount == 2 isn't used in the code, but maybe has to be used.
I tested with ScanCodeToChar  and now my OnKeyBoard is invoked when pushing an umlaut (though it is not yet painted on the screen)