如何在bash中运行应用程序并选择运行哪个监视器?

时间:2013-08-21 14:43:40

标签: linux qt

我有一个难以搜索答案的问题(我总是得到监视器操作的答案)。我正在编写一个bash shell脚本来帮助我编写代码,我有两个监视器。

当我运行我已经编译的可执行文件时,我想告诉它在特定的监视器上运行(即与我的终端打开的监视器不同,所以我可以在一个屏幕上查看调试并启用应用程序另一个)。

我该怎么做呢?类似的东西:

./myProject > but run on monitor 2

myProject是我的二进制可执行文件。

谢谢大家。

5 个答案:

答案 0 :(得分:8)

如果您在每台显示器上运行单独的显示器(这些天不太可能),DISPLAY环境变量就是您想要的。

如果您使用Xinerama(在多个显示器上传播一个逻辑显示),则:

  • 旁边:X11词汇:“显示”是带有输入设备的一个或多个“屏幕”;例如键盘和鼠标,a.k.a。“座位”。 “屏幕”是在一个或多个“监视器”上部分或完全显示的逻辑画布;当为一个“屏幕”使用多个监视器时,窗口可以部分显示在每个监视器上,但共享相同的X11 DISPLAY标识符;这叫做Xinerama。 DISPLAY格式为主机 : display-number . screen-id ,例如在我的Xinerama设置中,两个监视器都是屏幕0的一部分,显示数量从同一主机上的每个登录用户0开始计数。 “Seats”是使用不同硬件的监视器+输入的逻辑组;使用“虚拟控制台”切换可以发生多个“显示”,这就是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(含)之间。

通常的格式是:宽度 x 身高 ± x-offset ± < em> 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的输出; e.g。

$ 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

(您通常希望避免将Perl一行分隔到shell中的两行,但'\ ... '技巧可以使其在SO上清晰可读。)

答案 1 :(得分:5)

上面给出的--geometry答案在很多情况下都不会起作用......

有很多几乎完全相同的问题,这些问题浮现在各种StackExchange网站上。 AskUbuntu,我最终找到的答案(在基于Ubuntu 14.04的Linux Mint发行版上)是使用wmctrl。我正在留下答案,因为没有其他人在这个帖子中提到它。

(另一个名为Devil's Pie,另一个名为Compiz,如果你搜索那些,你也会找到Q&amp; A&#39; s我在说话约)

wmctrl是一种简单的unix工具,如果您正在编写Bash脚本,那么您可能正在寻找它。我也看到有人建议使用xdotool,具体取决于具体目标。

wmctrl按窗口标题或pid提供窗口匹配(与所有类型的X管理窗口不兼容)

一些有用的资源:

我根据我每天工作的地点在左侧或右侧连接第二台显示器,我认为我的解决方案将涉及

  • xrandr查找尺寸(如 BRPocock &#39;答案中所示),
  • 解析说明哪个是外部连接的显示器(VGA / HDMI等)而不是内置显示器,
  • 指定一个尺寸,以便在连接的屏幕上显示最大化窗口(即左/右/上/下偏移,它将根据所用屏幕的一侧而改变)

离开我的笔记,[最终]生成一些代码here,以防其他人有用。

答案 2 :(得分:4)

使用fifo

打开要显示输出的显示器上的终端窗口并执行

mkfifo /tmp/myfifo
cat /tmp/myfifo

然后在源终端上做

./myProject >/tmp/myfifo

这假设它是一个控制台应用程序。如果它是图形的,那么你将需要另一种方法,这将取决于你正在使用的窗口管理器+工具包。

答案 3 :(得分:3)

您需要做的就是在运行应用程序之前设置DISPLAY环境变量。

要找出您需要将其设置为的内容,请在要显示的显示器上运行以下命令:

echo $DISPLAY

您应该看到,例如:0.1:0.0

然后您可以指定您希望您的应用在该显示器上运行,如下所示:

DISPLAY=:0.1 ./my_app

答案 4 :(得分:0)

由于您的应用程序使用QT,您可能正在使用KDE。在System Settings > Window Behavior > Advanced中,将Placement设置为Under Mouse。单击所需的监视器,ALT + Tab切换到终端,然后启动程序。