I found that the lircd-uinput.service is used to send keyboard events to /dev/uinput, basically to the console. This is a handy service if you want to use a remote to send a keyboard key to a custom menu or program running on the console. The problem with the service, is that it keeps repeating the key until it receives a release code.
The 'repeat' behavior is by design, I guess because most well-written applications probably send something like a KEY_DOWN when a key is pressed, then a KEY_UP when it is released. But my simple application is not smart enough to send a release code, so I found an easy solution to the key repeat problem, and can use the service to fake a keyboard using an IR remote.
To make the lircd-uinput.service register the key-release event automatically, and stop repeating the key, edit the service and add the --add-release-events option.
sudo nano /lib/systemd/system/lircd-uinput.service
####find this line####
ExecStart=/usr/sbin/lircd-uinput
####change to#########
ExecStart=/usr/sbin/lircd-uinput --add-release-events
Restart the services and make sure they're active.
sudo systemctl force-reload lircd
sudo systemctl force-reload lircd-uinput
sudo systemctl status lircd
sudo systemctl status lircd-uinput
#I had to start lircd-uinput, since force-reload didn't:
sudo systemctl start lircd-uinput
Now the service only enters one keypress for each remote button press, and automatically sends the KEY_UP command. If you know how to send the KEY_UP commands in your application, that might work better than this solution.
To figure out the key commands that correspond to keyboard keys, you can list all possible keyboard events supported by the kernel by running:
irrecord -l
For example, if you want your remote to press the down arrow key on your console, the corresponding remote key is 'KEY_DOWN'. Then your remote file (/etc/lirc/lircd.conf.d/myremote.conf) would contain that key name.
begin remote
name myremote
#<sniped...remote stuff here...>
begin codes
# <sniped other codes>
KEY_DOWN 0x00FF
# <sniped other codes>
end codes
end remote
Now that we've stopped the key repeating, this is a really useful service. It is much more responsive than using irexec to fake a keyboard key to the console, and you don't need any configuration in irexec.lircrc to send keystrokes to your console. And you can still use irexec for your other, non-keyboard related commands.