OT: how to tell when i've hit a Fn key?

Polytropon freebsd at edvax.de
Fri Oct 7 07:32:25 UTC 2011


On Thu, 6 Oct 2011 21:51:01 -0700, Gary Kline wrote:
> On Thu, Oct 06, 2011 at 07:37:25PM -0400, Thomas Dickey wrote:
> > Date: Thu, 6 Oct 2011 19:37:25 -0400
> > From: Thomas Dickey <dickey at radix.net>
> > Subject: Re: OT: how to tell when i've hit a Fn key?
> > To: Gary Kline <kline at thought.org>
> > Cc: FreeBSD Mailing List <freebsd-questions at freebsd.org>
> > 
> > On Thu, Oct 06, 2011 at 03:41:17PM -0700, Gary Kline wrote:
> > > 
> > > I've got a 103-key keyboard.  most  of them produce the right WAV
> > > file.  i was having some trouble with the arrow key, but think i've
> > > found a resolution.  next are the Function key, F1 to F12. 
> > > 
> > > anybody on-list familiar with curses and can help me  with this?
> > > right now, most of the function keys output 4 clicks [!].  
> > 
> > I generally use tack for verifying the function-keys against the terminal
> > description.  (I don't recall seeing a port for tack, but it can probably
> > be built starting with ncurses-devel, though I haven't tried that, since
> > I build development versions of ncurses outside the ports).
> > 
> > For _seeing_ the codes, it helps to type ^V (lnext) right before pressing
> > a given key, making the escape character visible.
> > 
> 
> 	Hm.  no joy in mudville.  i know the first byte ia an
> 	ESC [ '\033].  the last, for F1, is an A.  the others are
> 	hidden.

>From DOS times (that DOS, not _the_ DOS!) I remember that
the function keys do generate a "two-key sequene": The first
character is a 0x00 byte, the next one is a regular key,
such as "A" for PF1. So you did basically check (in pseudocode):

	extended = false
	c = read character
	if c == 0x00 {
		extended = true
		c = read character
	}
	act upon c && if extended



> 	i'll check ncurses-devel and see w hat it has.  REAL code
> 	helps in stuff like this... .

I've written a (partially working) dialog library comparable
to NCurses Forms in C, using ncurses' built-in functionality.
So if you can, use what's already present and working. Instead
of dealing with the zero-bytes, it's much easier to use the
ncurses functionality.

Like this (except this is nonsense):

	int c;

	c = getch();
	if(c == KEY_F(1))	/* PF1 */
		do_stuff();
	if(c == KEY_UP)		/* Cursor up */
		do_more_stuff();
	if(c == 27)		/* Escape key! */
		get_out_of_prison();

>From memory: Space is 32, Return is 13, Backspace is 8, Tab is 9.
I think most of them are defined as macros in NCurses.

-- 
Polytropon
Magdeburg, Germany
Happy FreeBSD user since 4.0
Andra moi ennepe, Mousa, ...


More information about the freebsd-questions mailing list