2012-03-21 135 views
4

在我的基於Linux C++應用程序的控制檯中,我想獲取終端(行+列)的大小和當前光標位置。對於後者,我想我可以使用ANSI代碼,但我不知道如何正確解析它。另外我不明白如何獲得窗口的大小?在linux終端中獲取光標位置和終端大小

由於其他原因,切換到ncurses目前不是一個選項。

+0

你看過這個解決方案嗎? http://stackoverflow.com/a/1022961/522150而這個http://stackoverflow.com/a/1023006/522150。他們很好地解決了終端線路和列問題。 – nemesisfixx 2012-03-21 07:15:47

回答

2

獲取大小的舊方法是使用libtermcap的termcap。新是terminfo(+ lib)。 我會推薦使用一個將這個(和所有其他終端相關的東西)抽象出來的庫,並使用像(n)curses這樣的終端輸出庫。

這還可以在其他Unix系統上使用。

1

要獲取大小,正確的方法是調用TIOCGWINSZioctl()。從我的代碼示例:

struct winsize ws = { 0, 0, 0, 0 }; 
if(ioctl(tt->outfd, TIOCGWINSZ, &ws) == -1) 
    return; 

/* ws.ws_row and ws.ws_col now give the size */ 

你會想要做的,最初並收到SIGWINCH信號,它通知窗口的變化後,然後再次。

至於獲取光標位置,這有點困難。有些終端允許DSR 6(設備狀態報告)查詢它

$ echo -ne "\e[6n"; cat -v 
^[[62;1R 

從DSR答覆進來CSI R,在這裏告訴我的(基於1)第62行1列。

但是,由於並非所有的終端都支持DSR 6,所以最容易不依賴於能夠查詢光標位置,而是以絕對方式執行初始終端尋址,將光標放在您想要的位置。

+0

tt-> outfd是什麼?它有錯誤。 – user2029077 2013-09-02 04:23:59

+0

用於寫入終端的文件描述符;可能是STDOUT – LeoNerd 2013-09-16 13:34:29