如何获得终端大小更改事件?

时间:2015-07-23 17:33:30

标签: bash scala terminal

我正在开发一个运行在Bash脚本(在Linux机器上)的Scala脚本。为了拥有复杂的用户界面,我现在需要始终确切的终端大小。

那么如何才能让终端窗口大小(行,列)改变事件?像mc(Midnight Commander)这样的程序似乎对窗口大小的变化做出了立即的反应。我也想要这个:))

更新 larsks Thomas Dickey 的帮助下,我找到了一个解决方案,如下所示:

import sun.misc.{Signal, SignalHandler}

Signal.handle(new Signal("WINCH"), TerminalSizeChangedHandler)

object TerminalSizeChangedHandler extends SignalHandler
{
   override def handle(sig: Signal)
   {
      println("terminal size changed");     
   }    
}

该dowside,它依赖于sun.misc类。如果有人在没有sun.misc的情况下向我展示了一个同样简单的解决方案,那将会更加快乐:)

2 个答案:

答案 0 :(得分:2)

在X11下运行时,窗口大小更改应导致向您的程序发送SIGWINCH信号。您需要安排使用Scala为信号处理提供的任何机制来响应此信号(可能是like this,但我不知道任何Scala)。

答案 1 :(得分:0)

SIGWINCH独立于X11:

  • SIGWINCH可能最初用于NeWS PostScript 渲染系统),
  • NAWS(Telnet窗口大小选项)是另一个开始的地方。

尽管如此,X10R4(1986年12月)在xterm中使用了SIGWINCH。无论它的历史如何,它都不仅仅是X11的特色。

在Java中,您可以使用POSIXSignalHandler来捕获SIGWINCH。 Scala是Java的not identical,但这提供了一个起点。例如,有一些Github项目可能很有用: