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

我有一个难以search答案的问题(我总是以监视器操作的答案结束)。 我正在写一个bash shell脚本来帮助我的代码开发,我有两个显示器。

当我运行我编译的可执行文件时,我想告诉它在特定的显示器上运行(即,不同的显示器,我有我的terminal打开,所以我可以在一个屏幕上查看debugging,并在另一个应用程序)。

我怎么去做这个? 就像是:

./myProject > but run on monitor 2 

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

谢谢大家。

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

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

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

要在右侧显示器上显示一个窗口,我可以给出一个几何字符串,其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,但是'\'窍门就是让它在SO上清晰可见。

使用fifo

在想要输出的显示器上打开一个终端窗口,然后执行

 mkfifo /tmp/myfifo cat /tmp/myfifo 

然后在源终端上做

 ./myProject >/tmp/myfifo 

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

您只需在运行应用程序之前设置DISPLAY环境变量即可。

要找出需要设置的内容,请在要显示的显示器上运行以下内容:

 echo $DISPLAY 

你应该看到,例如:0.1或者:0.0

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

 DISPLAY=:0.1 ./my_app 

上面给出的--geometry答案在很多情况下不能用

有很多几乎相同的问题,像这样在各种StackExchange站点和AskUbuntu上浮动,我最终发现的答案(在基于Ubuntu 14.04的Linux Mint发行版上)是使用wmctrl 。 我正在离开一个答案,因为没有人在这个线程上提到它。

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

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

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

一些有用的资源:

  • wmctrl手册页
  • 用户文档1
  • 用户文档2
  • “ 如何使用命令将应用程序从工作区1转移到2?” “
  • 更具体的答案RE:指定尺寸
  • “ 如果你设置一个窗口最大化, wmctrlxdotoolwmctrl xdotool工作。 ”

我在左边或右边连接第二台显示器,这取决于我每天在哪里工作,而且我认为我的解决方案将涉及

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

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

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