2012-03-19 139 views
1

我試過這種方式,但它不起作用 - 從getmaxyx返回的值始終保持不變。如何使用Curses從調整大小的窗口獲取窗口大小?

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use Curses; 

my $size_changed = 0; 
$SIG{'WINCH'} = sub { $size_changed= 1; }; 

initscr(); 

my ($row, $col); 
getmaxyx($row, $col); 
addstr("begin: $row - $col\n"); 
refresh(); 

for (0 .. 19) { 
    addstr("-------------\n"); 
    if ($size_changed) { 
     getmaxyx($row, $col); 
     addstr("new: $row - $col\n"); 
     $size_changed = 0; 
    } 
    refresh(); 
    sleep 1; 

} 

sleep 3; 
endwin(); 

回答

1
#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use Curses; 

my $size_changed = 0; 
$SIG{'WINCH'} = sub { $size_changed= 1; }; 

initscr(); 

my ($row, $col); 
getmaxyx($row, $col); 
addstr("begin: $row - $col\n"); 
refresh(); 

for (0 .. 19) { 
    sleep 2; 
    if ($size_changed) { 
     endwin(); 
     refresh(); 
     getmaxyx($row, $col); 
     addstr("new: $row - $col\n"); 
     $size_changed = 0; 
    } 
} 

sleep 3; 
endwin(); 

^^^這對我有效。根據Writing Programs with NCURSES/Using NCURSES under XTERM你應該做的「endwin()後面刷新()」

1

瞭解幾乎一無所知Curses,在第一猜我會說你的問題是,你打破了$SIG{WINCH},因爲libcurses會想使用,當窗口可能已經改變尺寸檢測。

+0

作爲一個解決方法,而不是使用'$ SIG {WINCH}'我比較每一次在一個循環中舊的max_rows/max_cols與新MAX_ROWS/MAX_COLS。 – 2012-03-19 17:12:24

+0

另請參見['Signals :: XSIG'](http://search.cpan.org/perldoc?Signals::XSIG),以便您和Curses可以共享SIGWINCH處理程序。 – mob 2012-03-19 18:57:09

+0

檢測調整大小事件的標準方法是從'getch'觀察虛擬'KEY_RESIZE'事件。但是你沒有閱讀任何按鍵。 – cjm 2012-03-19 19:09:50