我想知道是否有一个工具可以查询当前关注的监视器。
我想要一个脚本来更改我当前使用的显示器上的墙纸(使用 xwallpaper)。据我了解,显示器编号或显示器名称(即 HDMI1、eDP1)都可能有助于实现我的目标。
最终,为当前监视器选择的壁纸将使用具有以下结构的名称复制:wall-HDMI1.png
或wall-eDP1.png
有一个部分解决方案,其中接受的答案建议使用鼠标的位置猜测当前监视器xdotool
。这似乎充其量是挑剔的。特别是在可以使用多种不同布局连接到多台显示器的笔记本电脑上。
如果您想知道当前的主监视器是什么,这很简单:
或者
如果你想知道鼠标指针当前在哪个显示器上,那就有点困难了。首先,您必须找出鼠标指针的位置(例如,使用
xdotool
),然后您必须将鼠标的 X、Y 坐标与每个屏幕的起始和结束 X 和 Y 坐标进行比较(例如,使用xrandr
)。下面的 perl 脚本使用
xrandr
andxdotool
来做到这一点。将其另存为,例如,
./get-focused-monitor.pl
使用 使其可执行chmod +x get-focused-monitor.pl
,然后运行它。它会告诉您鼠标指针当前悬停在哪个监视器上。运行它,
watch -n 0.1 ./get-focused-monitor.pl
当您将鼠标从一个显示器移动到另一个显示器时,看到显示名称发生变化,您会兴奋不已。我这样做了几十秒钟,兴奋从未改变。这几乎是太多了。顺便说一句,我目前连接了两台 1440p 显示器。横向模式下的 27 英寸显示器(“DP-2”,主要)和旋转到纵向模式的 24 英寸显示器(“DP-0”)。此脚本在我的系统上解析的
xrandr
输出如下所示:split /[x+]/
x
在脚本中,使用或作为分隔符将第三个或第四个字段拆分为一个由四个整数组成的数组+
:宽度、高度、x 偏移量和 y 偏移量。perldoc -f split
有关perlsplit()
函数如何工作的信息,请参阅。PS:为什么是perl?因为 perl 更容易——在 shell 的 while-read 循环中解析文本很糟糕,并且在 shell 中进行计算至少也很糟糕,我不想处理通常的 shell 空白和引用和分词问题,或者数组的异常丑陋的 shell 语法。而且 shell 并不是唯一一种可以通过管道将数据传入或传出外部程序的语言。unix 和 linux 上常用的大多数语言都可以做到这一点。
在 shell 中做这件事并不是特别困难,只是笨拙和笨拙。如果需要,请随意在 bash 中重新实现算法,重要的是方法,而不是语言。
顺便说一句,在 shell 中执行此操作的最简单方法是运行类似的东西
(xdotool getmouselocation --shell; xrandr) | awk '...'
并让 awk 解析来自两个程序的不同类型的输入。或使用 perl 而不是 awk。另外值得注意的是,与 shell 和 perl 一样,awk 也可以运行外部程序并处理它们的输出。perl 中还有一些设置工作(显式打开管道),但那是样板文件。其余的代码比在 shell 中要容易得多。
我可以使用反引号或
qx()
(参见perldoc -f qx
)来像在 shell 中那样进行命令替换,而不是使用open()
(参见perldoc -f open
)。例如:这将产生与第一个脚本完全相同的输出,但使用 perl 样式的命令替换而不是显式
open()
-ing 管道。它还使用正则表达式捕获组来提取数据,而不是split()
.顺便说一句,perl 有一个非常有用的函数,叫做
map
. 有关perfoc -f map
详细信息,请参阅(另请参阅有关perldoc -f grep
类似有用的内置)。这是一个非常有用且用途广泛的工具 - 您可以使用它的最简单的事情之一就是将第一个foreach
循环替换为:甚至:
两个版本基本相同:
map { CODE BLOCK } ARRAY
- 数组可以是已经存在的变量,也可以是匿名数组,以适合您当时的任何方式即时生成。正则表达式在列表上下文(匹配项或匹配项)中调用时返回一个数组。在上面的示例中,正则表达式匹配运算符 (
m/PATTERN/
) 被应用于循环的每个元素,foreach
循环依次遍历数组的元素(在这种情况下,数组是 的输出xdotool getmouselocation --shell
,每个数组元素一行)。还有其他方法
map
可以使用。根据您如何调用它,它可以返回一个标量值、一个数组或一个哈希值,这些值可以分配给变量或由其他函数使用。顺便说一句,
foreach
并且for
是 perl 中的同义词。我写的任何地方foreach
,你都可以用for
.for
/foreach
可以用来迭代数组(列表),就像我在上面使用过的一样,它也可以像 C 风格的for ($i = 1; $i < 10; $i++)
循环一样使用。可能有 perl 模块用于直接查询 X 以获取有关显示器和鼠标指针所需的信息,但我要花更长的时间才能找到它们并阅读它们的文档,而不仅仅是使用现有的
xdotool
工具xrandr
。