Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #39418

Re: How can I read individual keystrokes?

From Martin Gregorie <martin@mydomain.invalid>
Newsgroups comp.lang.java.programmer
Subject Re: How can I read individual keystrokes?
Date 2020-04-05 11:22 +0000
Organization A noiseless patient Spider
Message-ID <r6cf1b$h5k$1@dont-email.me> (permalink)
References <r6b830$hra$1@dont-email.me> <r6beb1$1sef$1@gioia.aioe.org>

Show all headers | View raw


On Sat, 04 Apr 2020 22:04:13 -0400, Arne Vajhøj wrote:

> On 4/4/2020 8:17 PM, Martin Gregorie wrote:
>> I have a need to read individual key presses as they are made. I'm
>> developing this stuff under Linux with OpenJava 1.8 and would prefer a
>> portable Java solution if that's possible.
>> 
>> I have a working solution, but its ugly. A small C program captures the
>> one or more characters emitted as a key is pressed and sends them
>> individually to my Java application over a local network session.
>> 
>> I've also tried using the Reader.read() method of the Reader instance
>> returned by calling Console.reader() but that uses line buffering
>> internally. As a result the Java code doesn't get sent anything until I
>> hit RETURN, when all the characters typed since the last RETURN are
>> sent,
>> followed by the LF, so is of no use here.
>> 
>> Also, there's a good chance that the C program is using OS-specific
>> features to let it capture individual keystrokes.
>> 
>> I have a feeling that I'm missing something obvious and so would
>> appreciate it if any of you can point me in the direction of a pure
>> Java way to capture individual key presses.
> 
> For a Swing app then it is easy: KeyListener.
> 
> For a console app it is a problem.
> 
> Some of the common workarounds are:
> * use JNI and some OS specific C code * use an existing library that
> does the above (like jCurses)
> * use an OS specific command (stty on Linux) to put console
>    in single character mode and use System.in.read()
> 
Thanks, guys: it looks as though I didn't miss anything.

I'm happy with using the C program as a keyboard listener knowing that 
there isn't a pure Java solution.

The application is, in fact, yet another Curses implementation(!). I 
looked at jCurses before I wrote it and decided to see how far I could 
get without diving into JNI and friends. So, first I wrote a from-the-
manual JTermcap implementation and then built my Curses implementation on 
that, using the O'Reilly "Programming with Curses" book and implementing 
all its functions as methods of my Curses class. Curses uses Cwindow and 
Jtermcap classes internally and reports errors by throwing 
CursesExceptions. The implementation follows the book closely enough to 
let it be used as its manual once its wrapped in a try...catch 
CursesException structure.

This was/is intended to be the basis of a 4GL written in Java and based 
heavily on the Sculptor 4GL. Why? Because writing applications with 
Sculptor is very fast and easy and it wouldn't adapt easily to using 
Swing. I think writing a set of Java file i/o support classes and then 
using Coco/R to create a Sculptor->Java translator should be doable.

Besides, years ago I wrote my own enhanced version of the Sculptor menu 
display program in C and using curses. That's  still in daily use on my 
Linux systems and on the OS-9 emulator I use to run Sculptor programs.
 

-- 
Martin    | martin at
Gregorie  | gregorie dot org

Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

How can I read individual keystrokes? Martin Gregorie <martin@mydomain.invalid> - 2020-04-05 00:17 +0000
  Re: How can I read individual keystrokes? Eric Sosman <esosman@comcast-dot-net.invalid> - 2020-04-04 20:38 -0400
  Re: How can I read individual keystrokes? Arne Vajhøj <arne@vajhoej.dk> - 2020-04-04 22:04 -0400
    Re: How can I read individual keystrokes? Martin Gregorie <martin@mydomain.invalid> - 2020-04-05 11:22 +0000

csiph-web