2011-07-14 18 views
2

GitHub如何使用termios區分Escape和Up/Down/Left/Right?

這是最好的我可以拿出來處理ncurses風格的按鍵(我實際上是由於各種原因寫一個替代ncurses)。

使用此代碼構建的示例應用程序建議用戶「通過按Escape退出」。事實上,它需要Escape + Escape或Escape +一個箭頭鍵。我想解決這個問題。

#include <sys/ioctl.h> 
#include <termios.h> 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *get_key() { 
    char c = getchar(); 

    switch(c) { 
     case 'a': return "a"; 
     case 'b': return "b"; 
     case 'c': return "c"; 

     ... 

     case '\x1b': 
      c = getchar(); 
      switch(c) { 
       case '[': 
        c = getchar(); 
        switch(c) { 
         case 'A': return "up"; 
         case 'B': return "down"; 
         case 'C': return "right"; 
         case 'D': return "left"; 
        } 
       case '\x1b': return "escape"; 
      } 

     default: return "unknown"; 
    } 

回答

-1

緩衝區,一些位選擇做的工作很好。

GitHub

+0

你介意鏈接到確切的代碼,我不知道在哪裏查看您的代碼庫。 – JustGage

2

第1步。研究。

http://en.wikipedia.org/wiki/Escape_sequence

如果Esc鍵和發送轉義序列都 應該是有意義的應用程序的其他鍵,歧義的時候,如果一個 終端或終端仿真是在使用中。特別是,當 應用程序收到ASCII轉義字符時,不清楚 該字符是否是用戶按下Esc鍵 的結果或者它是否是轉義序列的起始字符(例如, 產生於箭頭鍵按)。解決歧義的傳統方法是觀察另一個字符 是否快速跟隨轉義字符。如果不是,則假定不是 轉義序列的一部分。這種啓發式方法在某些 的情況下可能會失敗,但實際上它的工作原理相當不錯,尤其是 具有更快的現代通信速度。

第2步。弄清楚如何在操作系統的輸入緩衝區中看到另一個字符是否在等待。如果緩衝區中已有字符,這是一個轉義序列。如果輸入緩衝區是空的,那就是逃跑。

由於您沒有提及您的操作系統,目前尚不清楚如何完成此操作。

的Windows:What is the Windows equivalent to the capabilities defined in sys/select.h and termios.h

的Linux:http://linux.die.net/man/3/termios

+0

我在寫一個os-agnostic ncurses克隆。是的,時機似乎是唯一的方式 - 這是roguelikes如何做到的。我只是不知道如何使用VMIN/VTIME。 – mcandre

0

而不是依靠的VMIN/VTIME相當脆弱定時機構,則可能更喜歡向上移動定時邏輯成純用戶態。我寫了一個庫來處理這個和其他的一些情況:

http://www.leonerd.org.uk/code/libtermkey/

除了顯着的逃離方向鍵,也可以處理的事情等改性箭頭鍵和修飾的Unicode現代終端開始使用,支持阻塞和非阻塞使用,以及其他許多事情。事實上,您的get_key()函數可以通過termkey_waitkey()輕鬆執行以獲取按鍵,然後termkey_strfkey()將其格式化爲字符串緩衝區。