【问题标题】:how to get a terminal size changed event?如何获取终端大小更改事件?
【发布时间】:2015-07-23 17:33:30
【问题描述】:

我正在开发一个在 Bash 脚本中运行的 Scala 脚本(在 Linux 机器上)。为了拥有复杂的用户界面,我现在总是需要准确的终端尺寸。

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

更新:larsksThomas 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");     
   }    
}

不利的一面是,它依赖于 sun.misc 类。如果有人向我展示一个没有 sun.misc 的同样简单的解决方案,那会更开心:)

【问题讨论】:

  • 由于 scala 是 java,我会指点你 stackoverflow.com/questions/1286461/…
  • 在 Bash 中 export COLUMNS 之后,我可以在 Scala 中执行 sys.env("COLUMNS")。但该值仅反映 VM 启动时的情况。这没有帮助。那么像mc(午夜指挥官)这样的程序是如何做到的呢?
  • 好吧,我对“午夜指挥官”一无所知,您是否知道该程序是否在 Java 上运行?如果是这样,看看他们是怎么做的(如果你能找到他们的代码)。如果它在 C/C++ 中,您也许可以将他们的技术与 JNI 一起使用以使用他们自己的方法。

标签: bash scala terminal


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    SIGWINCH 独立于 X11:

    • SIGWINCH 可能首先用于NeWS,一个PostScript 渲染系统),并且
    • NAWS(Telnet 窗口大小选项)是另一个起点。

    X10R4(1986 年 12 月)仍然在 xterm 中使用 SIGWINCH。无论其历史如何,它都不仅仅是 X11 的一项功能。

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

    【讨论】:

    • 谢谢!那很有帮助。但是,POSIXSignalHandler 对我来说不是一个选项,因为它不是标准 JVM 的一部分。国际刑警组织的“signals.scala”看起来很有希望,但由于某种未知的原因,我无法开箱即用。狂喜可能有用;但是我需要研究一下,因为没有它的库它就无法工作......
    猜你喜欢
    • 2021-01-12
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2020-09-19
    • 2011-10-28
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多