如何使用 bash 检测光标是否位于标题栏上

如何使用 bash 检测光标是否位于标题栏上

我想知道一种方法来知道鼠标光标是否位于标题栏上或 kde plasma 中任何应用程序的内容上,并执行 bash 命令。

答案1

从技术上讲,bash 没有标题栏,因为它是一个文本终端应用程序。大概你的意思是 bash 正在运行的终端窗口的标题栏。幸运的是,该终端窗口的窗口 ID 似乎可用作环境变量$WINDOWID。(我不确定它来自哪里,所以它可能不可移植。)

该命令xdotool getwindowfocus将为您提供具有焦点的窗口的窗口 ID。因此,类似下面的代码将确定两者是否匹配:

if [ `xdotool getwindowfocus ` = "$WINDOWID" ]  ; then 
  echo has focus
else
  echo does not have focus
fi

当然,这不会告诉您它是否在标题栏中,只会告诉您窗口是否具有焦点,这可能至少意味着鼠标在窗口中。 (但如果您使用单击来获得焦点,则可能不是。)

因此,如果您实际上想检查鼠标位置而不是窗口焦点,这会变得有点棘手。该命令会尝试获取您的鼠标位置。您可以将其与从和xdotool getmouselocation获得的窗口位置进行比较。xdotool getwindowgeometry $WINDOWIDxwininfo -id $WINDOWID

这些命令的输出如下所示:

xdotool 获取鼠标位置

x:403 y:196 screen:0 window:21356415

xdotool getwindowgeometry $WINDOWID

  Position: 163,280 (screen: 0)
  Geometry: 496x660

xwininfo -id $WINDOWID (摘录)

  Absolute upper-left X:  153
  Absolute upper-left Y:  235
  Relative upper-left X:  10
  Relative upper-left Y:  45
  Width: 496
  Height: 660
  Corners:  +153+235  -3191+235  -3191-185  +153-185
  -geometry 80x47+143+190

使用来自 wininfo 的信息,很明显鼠标 X 位置在窗口内。鼠标 Y 位置不在绝对窗口坐标内。相对坐标表示窗口在框架内的位置,因此标题栏左上角实际上应该在终端窗口左侧 10 像素处和上方 45 像素处。鼠标在该范围内,因此我们可以猜测它位于窗口的标题栏中。(这是在 Gnome 中测试的,KDE 中的结果应该类似但不完全相同。)

查看来自 xdotool 的窗口几何信息,它似乎已将相对偏移信息添加到窗口坐标两次,并且似乎没有办法用 xdotool 查询该信息,因此不幸的是,这似乎是有缺陷的和错误的。

因此,这给你留下了一个可行的方法(但不是语法,抱歉)来解决这个问题。

话虽如此,如果您使用的是 Wayland,xdotool getmouselocation则可能无法工作。如果您的终端是在 Wayland 中运行的 X11 应用程序,则当鼠标位于聚焦的终端窗口上时,您将获得有效的鼠标位置和焦点信息。但是,当鼠标不在 X11 窗口中或 Wayland 窗口中时,鼠标坐标不会更新,并且将反映它上次在 X11 窗口中的位置。当 Wayland 窗口获得焦点时,getwindowfocus 命令会给出错误(没有结果)。如果您的终端窗口是 Wayland 应用程序,当鼠标位于终端窗口上时,xdotool 将无法获取任何有用的信息。因此,假设您的终端是 X11 应用程序,可能可以结合来自 xdotool 和 xwininfo 的信息在 Wayland 中找出答案,但这在最好的情况下是不可靠的,在最坏的情况下根本不会得到任何结果。

(注意:这在 Wayland 中不起作用的原因是 Wayland 认为向所有应用程序提供鼠标位置等信息存在安全风险,因为它会泄露信息。这种小小的不便有一定道理,但改回来的理由并不多。)

相关内容