Então, depois de quatro anos, finalmente tenho um rascunho de uma resposta para essa pergunta. A resposta é usar as Ferramentas de Interceptação que usam a libevdev para pegar a entrada do teclado e processá-la antes de emitir a nova versão. Em relação ao mapeamento simultâneo de chaves, fiz um plugin áspero para o Interception Tools chamado Chorded Keymap que permite h , j , k , l age como as teclas de seta quando s e d são pressionado simultaneamente.