在我的基於Linux C++應用程序的控制檯中,我想獲取終端(行+列)的大小和當前光標位置。對於後者,我想我可以使用ANSI代碼,但我不知道如何正確解析它。另外我不明白如何獲得窗口的大小?在linux終端中獲取光標位置和終端大小
由於其他原因,切換到ncurses目前不是一個選項。
在我的基於Linux C++應用程序的控制檯中,我想獲取終端(行+列)的大小和當前光標位置。對於後者,我想我可以使用ANSI代碼,但我不知道如何正確解析它。另外我不明白如何獲得窗口的大小?在linux終端中獲取光標位置和終端大小
由於其他原因,切換到ncurses目前不是一個選項。
獲取大小的舊方法是使用libtermcap的termcap。新是terminfo(+ lib)。 我會推薦使用一個將這個(和所有其他終端相關的東西)抽象出來的庫,並使用像(n)curses這樣的終端輸出庫。
這還可以在其他Unix系統上使用。
要獲取大小,正確的方法是調用TIOCGWINSZ
ioctl()
。從我的代碼示例:
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,所以最容易不依賴於能夠查詢光標位置,而是以絕對方式執行初始終端尋址,將光標放在您想要的位置。
tt-> outfd是什麼?它有錯誤。 – user2029077 2013-09-02 04:23:59
用於寫入終端的文件描述符;可能是STDOUT – LeoNerd 2013-09-16 13:34:29
你看過這個解決方案嗎? http://stackoverflow.com/a/1022961/522150而這個http://stackoverflow.com/a/1023006/522150。他們很好地解決了終端線路和列問題。 – nemesisfixx 2012-03-21 07:15:47