我有一个很难找到答案的问题(我总是得到监视器操作的答案)。我正在编写一个 bash shell 脚本来帮助我进行代码开发,并且我有两个监视器。
当我运行我编译的可执行文件时,我想告诉它在特定的监视器上运行(即与我打开终端的监视器不同,以便我可以在一个屏幕上查看调试并在另一个屏幕上运行应用程序)。
我该怎么做呢?就像是:
./myProject > but run on monitor 2
myProject
我的二进制可执行文件在哪里。
谢谢大家。
如果您在每个监视器上运行单独的显示(现在不太可能),那么DISPLAY
环境变量就是您想要的。
但是,如果您使用 Xinerama(将一个逻辑显示分布在多个监视器上),则:
DISPLAY
标识符;这被称为Xinerama。DISPLAY
格式是host :
display-number .
screen-id ,所以例如在我的Xinerama 设置中,两个显示器都是屏幕的一部分,0
显示编号从0
与同一主机上的每个登录用户。“席位”是使用不同硬件的监视器+输入的逻辑组;使用“虚拟控制台”切换可以发生多个“显示”,这就是 Gnome 和 KDE 允许多个用户在单个“座位”机器上登录的方式。大多数 GUI 工具包允许您使用--geometry
或-geometry
开关指定窗口的几何形状。
Qt 使用较旧的 MIT 样式-geometry
形式。GTK+/Gnome 使用 GNU 风格的--geometry
.
这假设您允许 Qt 对您的命令行进行后处理,例如传入argv
或QtApplication
类似的。
“逻辑显示器”的分辨率是显示器排列的每个方向上的分辨率之和。例如,我现在连接了 2 × 1920×1080 显示器。xrandr
报告:
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 8192 x 8192
为了在右侧显示器上显示一个窗口,我可以给出一个几何字符串,它x
的坐标在 1920…3839(含)之间。
通常的格式是:width x
height ±
x-offset ±
y-offset——但如果你喜欢使用默认值,宽度和高度是可选的。是±
相+
对于顶部/左侧-
计数,或相对于底部/右侧计数。
因此,例如:
gedit --geometry 800x600+1920+0 # set size at top-left of right screen
gedit --geometry +1920+100 # default size at top-left of right screen
gedit --geometry -0+0 # default size at top-right of entire display
不幸的是,我所知道的从 shell 确定每个监视器上显示区域的唯一编程方法是解析来自的输出xrandr
;例如
$ xrandr
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 8192 x 8192
LVDS1 connected (normal left inverted right x axis y axis)
1366x768 60.0 +
1024x768 60.0
800x600 60.3 56.2
640x480 59.9
VGA1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 510mm x 287mm
1920x1080 60.0*+
1680x1050 60.0
1280x1024 60.0
1440x900 59.9
1280x720 60.0
1024x768 60.0
800x600 60.3
640x480 60.0
720x400 70.1
HDMI1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 510mm x 287mm
1920x1080 60.0*+
1680x1050 59.9
1280x1024 60.0
1440x900 59.9
1280x720 60.0
1024x768 60.0
800x600 60.3
640x480 60.0
720x400 70.1
DP1 disconnected (normal left inverted right x axis y axis)
$ xrandr | perl -ne 'if (/(\d+)x(\d+)\+(\d+)\+(\d+)/) '\
> ' { print "$3,$4 - ", $3 + $1 - 1, ",", $4 + $2 - 1, "\n" }'
0,0 - 1919,1079
1920,0 - 3839,1079
(您通常希望避免在 shell 中将 Perl 单行拆分为两行,但'\
...<code>' 的技巧是让它在 SO 上清晰易读。)
上面给出并接受的--geometry
答案在许多情况下根本不起作用......
在各种 StackExchange 站点和 AskUbuntu 上都有很多类似的问题,我最终找到的答案(在基于 Ubuntu 14.04 的 Linux Mint 发行版上)是使用wmctrl
. 我留下一个答案,因为没有其他人在这个线程上提到它。
(如果你Devil's Pie
也Compiz
搜索那些,你会找到我正在谈论的问答)
wmctrl
如果您正在编写 Bash 脚本,那么您可能正在寻找一种简单的 unix 工具。我还看到有人建议使用xdotool
,这取决于具体目标是什么。
wmctrl
提供按窗口标题匹配的窗口或pid
(与所有类型的 X 管理窗口不兼容)
一些有用的资源:
wmctrl
手册页wmctrl
,两者都可以正常工作。”</li>
xdotool
我根据每天的工作地点在左侧或右侧连接第二台显示器,我认为解决方案将涉及
xrandr
(如BRPocock的答案所示),留下我的笔记和[最终]在这里生成的一些代码,以防它对其他人有用。
用一个fifo
在您希望输出出现的监视器上打开一个终端窗口并执行
mkfifo /tmp/myfifo
cat /tmp/myfifo
然后在源终端上做
./myProject >/tmp/myfifo
这假设它是一个控制台应用程序。如果它是图形的,那么您将需要另一种方法,这将取决于您使用的窗口管理器 + 工具包。
您需要做的就是DISPLAY
在运行应用程序之前设置环境变量。
要找出您需要将其设置为的内容,请在您希望它显示的监视器上运行以下命令:
echo $DISPLAY
例如,您应该看到:0.1
或:0.0
。
然后您可以指定您希望您的应用程序在该显示器上运行,如下所示:
DISPLAY=:0.1 ./my_app
由于您的应用程序使用 QT,您可能正在使用 KDE。中System Settings > Window Behavior > Advanced
,设置Placement
为Under Mouse
。单击所需的监视器,ALT+Tab 切换到您的终端,然后启动程序。