如何检测 Linux 中终端何时获得焦点?

如何检测 Linux 中终端何时获得焦点?

我希望能够计算我在终端前花费的时间。我认为最好的方法是使用某种计时器,当终端获得/失去焦点时启动和停止。而且它必须与多个终端配合使用...

有什么想法吗?我正在使用 GNOME。

答案1

如果您的终端 shell 可以轻松访问其自己的 X 窗口 ID,那么您可能做错了!它们彼此无关 - 例如,您可以(并且应该)在其中运行长时间作业,screen理论上这些作业可以输出到世界上任何地方的任意数量的终端。

话虽如此,我解决这个问题的方法是使用提示符更新终端的“状态”/“标题”的能力来报告 shell 的 PID,如以下提示符所示:

PS1=\u@\H:\w\$\ \[\e]2;\u@\H:\w [$$]\a\]

任何显示具有此提示符和 PID 6399 的 shell 的伪终端都具有类似 的标题user@host:~ [6399]然后,使用类似控制端,你可以编写如下 bash 脚本:

win_from_pid() {
   type wmctrl &>/dev/null || return 1
   wmctrl -l | awk '/^.*\['"$1"'\]$/ { print $1 }'
}

这将搜索窗口列表并为您提供以该标题结尾的任何 X Window ID。因此,该函数win_from_pid $$可以告诉您运行脚本的同一主机上的窗口 ID(如果有)。您可以从那里了解如何确定焦点。:)

答案2

我估计你必须监听 X-window 消息来获取适当的 FOCUS 消息。不过不确定这有多容易/困难。

或者https://stackoverflow.com/questions/1014822/how-to-know-which-window-has-focus-and-how-to-change-it讨论确定具有焦点的窗口并提供了几个选项:您可以使用该技术并在循环中运行它并跟踪焦点的变化。

答案3

您可以在终端上进行统计并获取访问或修改时间。

stat /dev/pts/2

相关内容