Кто-то относительно недавно спрашивал что-то подобное. Кроме способа на уровне иксов (XTest) можно заставить ядро генерировать события как будто с отдельного устройства ввода (оно будет подцеплено evdev'ом). Для этого существует модуль ядра uinput. Насколько я понял - это что-то вроде loopback'а для устройств ввода.
"Using uinput driver in Linux-2.6.x to send user input" - http://www.einfochips.com/download/dash_jan_tip.pdf