Capturing keystrokes

Chris wendlec at tcd.ie
Fri Feb 7 08:21:19 PST 2014


On Friday, 7 February 2014 at 15:40:06 UTC, Adam D. Ruppe wrote:
> On Friday, 7 February 2014 at 12:17:42 UTC, Chris wrote:
>> Just out of interest, is there a way of capturing keystrokes 
>> in D?
>
> This isn't so much a D question as a C one - the operating 
> system's C api will give a way, then you use those same 
> functions in D.
>
> If you want input from your own terminal, my terminal.d might 
> help. See the demo main here:
>
> https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff/blob/master/terminal.d#L2007
>
>
> It captures as much info as possible in real time, optionally 
> including window resize events, mouse motion and clicks, and 
> key presses. (Also key releases on Windows, but such 
> information is /not/ available on Linux.)
>
> Ctrl+x keys are sent as as low ascii values. Ctrl+a is 
> cast(char) 1. Ctrl+b is cast(char) 2. Ctrl+c is sent as 
> cast(char) 3 (though note control+c is captured by the OS and 
> sent as an interrupt signal instead - my lib can catch that 
> too). and so on through Ctrl+z which is 26.
>
>
> You can get more information by doing a GUI program but then 
> you'll have to do text output as gui too, so not as easy as 
> cli. Of course, you could write a terminal emulator and have 
> the best of both worlds... i've done it :)
>
> https://github.com/adamdruppe/terminal-emulator
>
>
> But I think terminal.d is what you want.
>
>
>
> Now, if you want to capture input from ANY window, not just 
> your own, on Windows you can use the API to capture the 
> keyboard, on X you can listen to events on the root window, and 
> on Linux you can also read /dev/input to get raw keyboard 
> events (if you like, I have a small lib that can help with this 
> too). Note that reading /dev/input needs your program to be 
> root.

I just had a look at terminal.d. Great stuff. It works, though it 
sometimes stops working and gives me this exception (after 
killing it with Ctrl+C):

object.Exception at terminal.d(814): write failed for some reason

There is a syntax error on line 54;

version = Demo

should be

version = Demo;

I'll have a look at your other stuff too, it looks very 
interesting.


More information about the Digitalmars-d mailing list