Marcin Petrów
Marcin Petrów

Reputation: 1497

NCurses and ESC,ALT keys

I have a problem with NCurses... i need to handle all keys like Esc, Alt+F etc. Problem is that the codes are similar... i.e:


Esc - 27


Alt+A - 27 65


As an example there is double code for Alt+[key] combination what similar to Esc key... Any ideas how handle that?

Upvotes: 16

Views: 38306

Answers (4)

Al Ro
Al Ro

Reputation: 511

if you don't care to support users who hit escape and then another key (a holdover from old terminals vt100 era terminals I think), and just want to respond to the physical keys on the pc 101 key-board, you can set this at the start of your (c) code:

ESCDELAY = 10;

the man page explains what's going on in more detail: https://man7.org/linux/man-pages/man3/curs_variables.3x.html

then use keyname() to get an easily strcmp'ed human readable name for what was pressed such as ^c for control+c. See How to get Ctrl, Shift or Alt with getch() ncurses?

Upvotes: 5

Marcin Petrów
Marcin Petrów

Reputation: 1497

Resolved by:

  1. Use noecho or timeout mode
  2. Check for 27(ALT or ESC) code... if pass:
  3. try to read another code
  4. if another code is ERR then.. you have ESC key in other way you have ALT+another code

Upvotes: 10

sjohnson.pi
sjohnson.pi

Reputation: 398

Here is an example for python:

key = self.screen.getch()
if key == ord('q'): # quit
    go = False
elif key == 27: # Esc or Alt
    # Don't wait for another key
    # If it was Alt then curses has already sent the other key
    # otherwise -1 is sent (Escape)
    self.screen.nodelay(True)
    n = self.screen.getch()
    if n == -1:
        # Escape was pressed
        go = False
    # Return to delay
    self.screen.nodelay(False)

Upvotes: 19

Related Questions