Sebastian E. Asked: 2022-10-30 19:41:10 +0800 CST2022-10-30 19:41:10 +0800 CST 2022-10-30 19:41:10 +0800 CST 如何用bash检测光标在标题栏上 772 我想知道一种方法来知道鼠标光标是在标题栏上还是在 kde plasma 中任何应用程序的内容上,执行 bash 命令。 kde5 1 个回答 Voted Best Answer user10489 2022-10-30T21:35:11+08:002022-10-30T21:35:11+08:00 从技术上讲,bash 没有标题栏,因为它是一个文本终端应用程序。大概您的意思是终端窗口 bash 的标题栏正在运行。幸运的是,该终端窗口的窗口 ID 似乎可用作 environment variable $WINDOWID。(我不确定这是从哪里来的,所以它可能不是便携式的。) 该命令xdotool getwindowfocus将为您提供具有焦点的窗口的窗口 ID。因此,如下代码将确定这两个匹配项: if [ `xdotool getwindowfocus ` = "$WINDOWID" ] ; then echo has focus else echo does not have focus fi 当然,这并不能告诉你它是否在标题栏中,只是窗口是否有焦点,这可能意味着鼠标至少在窗口中。(但如果您使用点击聚焦,则可能不会。) 所以如果你真的想检查鼠标位置而不是窗口焦点,这会变得有点棘手。该命令xdotool getmouselocation尝试获取您的鼠标位置。您可以将其与您从xdotool getwindowgeometry $WINDOWID和获得的窗口位置进行比较xwininfo -id $WINDOWID。 这些命令的输出如下所示: xdotool getmouselocation 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 窗口中时的位置。getwindowfocus 命令给出了一个错误(没有结果)Wayland 窗口被聚焦。如果您的终端窗口是 Wayland 应用程序,当鼠标悬停在终端窗口上时,xdotool 将无法获取任何有用的信息。因此,假设您的终端是 X11 应用程序,可能可以结合来自 xdotool 和 xwininfo 的信息以在 Wayland 中计算出来,但这充其量是不可靠的,最坏的情况是根本不会得到任何结果。 (注意:这在 Wayland 中不起作用的原因是因为 Wayland 已决定向所有应用程序提供鼠标位置等信息是一种安全风险,因为它会泄露信息。这种轻微的不便有一些理由,而不是很多理由改回来。)
从技术上讲,bash 没有标题栏,因为它是一个文本终端应用程序。大概您的意思是终端窗口 bash 的标题栏正在运行。幸运的是,该终端窗口的窗口 ID 似乎可用作 environment variable
$WINDOWID
。(我不确定这是从哪里来的,所以它可能不是便携式的。)该命令
xdotool getwindowfocus
将为您提供具有焦点的窗口的窗口 ID。因此,如下代码将确定这两个匹配项:当然,这并不能告诉你它是否在标题栏中,只是窗口是否有焦点,这可能意味着鼠标至少在窗口中。(但如果您使用点击聚焦,则可能不会。)
所以如果你真的想检查鼠标位置而不是窗口焦点,这会变得有点棘手。该命令
xdotool getmouselocation
尝试获取您的鼠标位置。您可以将其与您从xdotool getwindowgeometry $WINDOWID
和获得的窗口位置进行比较xwininfo -id $WINDOWID
。这些命令的输出如下所示:
xdotool getmouselocation
xdotool getwindowgeometry $WINDOWID
xwininfo -id $WINDOWID(摘录)
使用来自 wininfo 的信息,很明显鼠标 X 位置在窗口内。鼠标 Y 位置不在绝对窗口坐标内。相对坐标表示窗口在框架内的位置,因此标题栏的左上角实际上应该是向左 10 像素,高于终端窗口 45 像素。鼠标在那个范围内,所以我们可以猜测它在窗口的标题栏中。(这是在 Gnome 中测试的,在 KDE 中的结果应该相似但不完全相同。)
查看来自 xdotool 的窗口几何信息,它似乎已将相对偏移信息添加到窗口坐标两次,并且似乎没有办法使用 xdotool 查询该信息,因此不幸的是,这似乎是错误的错误.
所以这给你留下了一个可能的方法(但不是语法,对不起)来解决这个问题。
说了这么多,如果你使用的是 Wayland,
xdotool getmouselocation
可能不起作用。如果您的终端是在 Wayland 中运行的 X11 应用程序,当鼠标悬停在焦点终端窗口上时,您将获得有效的鼠标位置和焦点信息。但是,当鼠标不在 X11 窗口中或 Wayland 窗口中时,鼠标坐标不会更新,而是会反映上次在 X11 窗口中时的位置。getwindowfocus 命令给出了一个错误(没有结果)Wayland 窗口被聚焦。如果您的终端窗口是 Wayland 应用程序,当鼠标悬停在终端窗口上时,xdotool 将无法获取任何有用的信息。因此,假设您的终端是 X11 应用程序,可能可以结合来自 xdotool 和 xwininfo 的信息以在 Wayland 中计算出来,但这充其量是不可靠的,最坏的情况是根本不会得到任何结果。(注意:这在 Wayland 中不起作用的原因是因为 Wayland 已决定向所有应用程序提供鼠标位置等信息是一种安全风险,因为它会泄露信息。这种轻微的不便有一些理由,而不是很多理由改回来。)