ASCII控制台 - 如何处理窗口调整大小?

时间:2014-08-10 22:35:33

标签: php ascii

这是一段简单的代码,它绘制一个绿色条几乎与屏幕一样长,并在最后写一个数字,定期刷新(代码是PHP,但它只是常规的ascii代码):

function update($x)
{
    // get the console width
    $width = exec('tput cols');

    // go back up a line if this isn't the first line
    if($x) {
        echo "\033[1A";
    }

    // print a green bar with a number at the end
    echo "\033[42m" . str_repeat(' ', $width - 4) . "$x ";

    // reset formatting and add a new line for next time
    echo "\033[0m\n";
}

for($i = 0; $i < 100; ++$i) {
    update($i);

    // sleep for 0.1 seconds
    usleep(100000);
}

当窗口调整大小时,会按预期填充新空间,但是然后您尝试缩小窗口,布局会全部损坏。

我不想重置整个窗口,只需确保该行始终是控制台的宽度(末尾的数字)。这可能吗?

1 个答案:

答案 0 :(得分:1)

您可以为SIGWINCH事件注册信号处理程序。如果窗口大小发生变化,将发出此事件。

在信号处理程序代码中,您将重新绘制绿色条:

declare(ticks = 1); 

// Called if the window will get resized
function sig_handler($signo) 
{
    update(123);
}

function update($x)
{

    // Restore Cursor
    echo "\033[u";

    // Erase line
    echo "\033[1K";

    // Get the console width
    $width = exec('tput cols');

    // Go back up a line if this isn't the first line
    if($x) {
        echo "\033[1A";
    }   

    // Print a green bar with a number at the end
    echo "\033[42m" . str_repeat(' ', $width - 4) . "$x ";

    // Reset formatting and add a new line for next time
    echo "\033[0m\n";
}

// Register Signal handler
pcntl_signal(SIGWINCH, "sig_handler");

// Save cursor position
echo "\033[s";

update(123);

// Your program ...
while(true) {
    sleep(1);
}

您可以使用ANSI terminal reference关注我使用的终端代码。