2012-04-18 3 views
5
나는 크기 조정 신호를 처리하기 위해 노력하고

(SIGWINCH)는 ncurses를 가진 단말기 크기

void Server::resizeSignalHandler(int a) 
{ 
signal(SIGWINCH, SIG_IGN); 

endwin(); 
initscr(); 
refresh(); 
clear(); 

int x,y; 
getmaxyx(stdscr, y, x); 

wmove(upScreen, 0, 0); 
wmove(downScreen, y/2, 0); 
wresize(upScreen, y/2, x); 
wresize(downScreen, y/2, x); 
wclear(upScreen); 
wclear(downScreen); 
waddstr(upScreen, "test1"); 
waddstr(downScreen, "test2"); 
wrefresh(upScreen); 
wrefresh(downScreen); 
refresh(); 

signal(SIGWINCH, Server::resizeSignalHandler); 

} 
Server::Server() 
{ 
//ncurses screen initialization 
initscr(); 

if (!upScreen) { 
    upScreen = newwin(0, 0, 1, 1); 
} 
if (!downScreen) { 
    downScreen = newwin(0, 0, 1, 1); 
} 
//adjusting screen when user resize terminal 
signal(SIGWINCH, Server::resizeSignalHandler); 

//configuring screens 
Server::resizeSignalHandler(0); 

waddstr(Server::upScreen, "lalfasdfsafd as"); 
waddstr(downScreen, "supreme!"); 
wrefresh(Server::upScreen); 
wrefresh(downScreen); 
} 

를 결정할 수 없습니다, y는 (항상 동일 크기는 변화하지 않았다). 또한 ioctl을 사용하여 크기를 결정하려고 시도했지만 아무 것도 변경되지 않았습니다.

내가 내 앞에서 많은 사람들이 때때로이 문제 http://www.mail-archive.com/[email protected]/msg11253.html 을 한 것으로 파악, 그들은 그 (변경은/etc/프로파일을, O (원문)!) 해결,하지만 때로는 없습니다. mac os x terminal에 대한 대안이 있습니까? 아마도 ncurses는 xterm 및 유사 제품 전용입니다.

+0

:

resize_term(size.ws_row, size.ws_col) 그래서 신호 처리기 코드가 같아야 호출해야합니다, getmaxyx(...) 데이터를 업데이트합니다. 터미널이나 Xcode의 가짜 용어로 실제로 테스트 중이십니까? – Geoffroy

+0

xcode에서 테스트 할 수 없습니다. 터미널에서. – badeleux

답변

-1

저는 Mac 컴퓨터가 없으므로 이것을 테스트 할 수 없습니다. 하지만 가상 터미널 bash는 $ LINES 및 $ COLUMNS 업데이트를 실행하고 있다고 가정합니다. 그러나이 업데이트는 프로그램이 할당 된 가상 터미널로 전달되지 않습니다. WINCH 신호가 잡히지 만 그 매개 변수는 업데이트되지 않기 때문입니다. 해결 방법은 신호 처리기에서 "/usr/X11/bin/resize"/"/usr/bin/resize"을 실행하는 것입니다. 아마도 $ LINES와 $ COLUMNS를 제대로 업데이트 할 것입니다.

+0

실제로 작동합니다. 하지만 (echo $ LINES에 의해) 셸 변수를 읽으려고 할 때 (ioctl, getmaxyx 등과 같은) 잘못된 값을 반환합니다. 고맙게도/usr/X11/bin/resize는 올바른 정보를 반환합니다. . 내가 말한대로 – badeleux

0

확실하지 않지만 업데이트 된 터미널 매개 변수를 얻으려면 ioctl(1, TIOCGWINSZ, struct winsize*)으로 전화해야한다고 생각합니다. man tty_ioctl을 참조하십시오.

+0

, 그것은 나를 위해 작동하지 않았다. – badeleux

1

getmaxyx으로 얻는 값이 SIGWINCH을 수신하는 신호 처리기로 업데이트되기 때문입니다. resizeSignalHandler에 전화 후

old_callback = signal(SIGWINCH, Server::resizeSignalHandler); 

과 : 당신은 같은과 함께 기존의 신호로 포인터를 저장해야

old_callback(a); 
1

getmaxyx(...)가 제공 (업데이트되지 않음) 때문에 사용자 정의 SIGWINCH 신호 처리기의 터미널 크기 잘못 .

ioctl(fileno(stdout), TIOCGWINSZ, struct winsize*)을 사용하면 업데이트 된 터미널 매개 변수를 얻을 수 있습니다. 그러나 getmaxyt(...)에 의해 반환 된 데이터는 업데이트되지 않습니다. 그게 문제가되지 않습니다, 그래서 당신은 OSX 기간이 xterm 등으로 동작 할 수

void on_terminal_resize(int n) { 
    struct winsize size; 

    if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) { 
     resize_term(size.ws_row, size.ws_col); 
    } 
    // Your code goes here... 
    signal(SIGWINCH, on_terminal_resize); 
} 
관련 문제