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

cod*_*der 12 linux qt

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

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

我该怎么做呢?就像是:

./myProject > but run on monitor 2
Run Code Online (Sandbox Code Playgroud)

myProject我的二进制可执行文件在哪

谢谢大家.

BRP*_*ock 8

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

但是,如果您使用Xinerama(在多个监视器之间传播一个逻辑显示),

  • 旁白:X11词汇:"显示"是一个或多个带有输入设备的"屏幕"; 例如键盘和鼠标,又称"座位"."屏幕"是在一个或多个"监视器"上部分或完全显示的逻辑画布; 当为一个"屏幕"使用多个监视器时,窗口可以部分显示在每个监视器上,但共享相同的X11 DISPLAY标识符; 这叫做Xinerama.该DISPLAY格式是主机 : 显示数 . 屏幕-ID,所以例如在我的Xinerama建立两个监视器屏幕的一部分0上,从向上计数的显示编号0与同一主机上的每个登录的用户."Seats"是使用不同硬件的监视器+输入的逻辑组; 使用"虚拟控制台"切换可以发生多个"显示",这就是Gnome和KDE允许多个用户在单个"座位"机器上登录的方式.

大多数GUI工具包允许您使用--geometry-geometry切换指定窗口的几何.

  • Qt使用较旧的MIT风格-geometry表格.GTK +/Gnome使用GNU风格--geometry.

  • 这是假设你允许Qt来后处理您的命令行,例如,通过argvQtApplication或相似.

"逻辑显示"将具有分辨率,该分辨率是显示器布置的每个方向上的分辨率的总和.例如,我现在连接了2×1920×1080显示器.xrandr报告:

Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 8192 x 8192
Run Code Online (Sandbox Code Playgroud)

要在右侧监视器上显示窗口,我可以给出一个几何字符串,其x坐标在1920 ... 3839(含)之间.

通常的格式是:宽度 x 高度 ± x偏移 ± y偏移 - 但宽度和高度是可选的,如果您更喜欢采用默认值.的±+计数相对于顶部/左,或-相对于底部/右计数.

所以,例如:

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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我知道从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
Run Code Online (Sandbox Code Playgroud)

(你通常希望避免在外壳中的两条线上分割Perl单行,但是'\...... '那里的技巧会让它在SO上清晰可见.)


Lou*_*dox 5

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

有很多几乎相同的问题,比如浮在各种StackExchange站点和AskUbuntu周围,我最终找到的答案(在基于Ubuntu 14.04的Linux Mint发行版上)是可以使用的wmctrl.我正在留下答案,因为没有其他人在这个帖子中提到它.

(还有一个被叫Devil's Pie,另一个被叫,Compiz如果你搜索那些,你会发现我正在谈论的Q&A)

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

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

一些有用的资源:

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

  • 找到尺寸xrandr(如BRPocock的回答所示),
  • 解析它,以告诉哪个是外部连接的显示器(VGA/HDMI等),而不是内置的,
  • 指定一个尺寸,以便为连接屏幕上的最大化窗口(即左/右/上/下偏移,它将根据正在使用的屏幕的一侧而改变)

留下我的笔记和[最终] 这里生成的一些代码,以防它对其他人有用.