2012-03-19 137 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