18

我有一个很难找到答案的问题(我总是得到监视器操作的答案)。我正在编写一个 bash shell 脚本来帮助我进行代码开发,并且我有两个监视器。

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

我该怎么做呢?就像是:

./myProject > but run on monitor 2

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

谢谢大家。

4

5 回答 5

9

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

但是,如果您使用 Xinerama(将一个逻辑显示分布在多个监视器上),则:

  • 旁白:X11 词汇:“显示器”是一个或多个带有输入设备的“屏幕”;例如键盘和鼠标,又名“座位”。“屏幕”是部分或全部显示在一个或多个“监视器”上的逻辑画布;当为一个“屏幕”使用多个监视器时,窗口可以部分显示在每个监视器上,但共享相同的 X11DISPLAY标识符;这被称为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 单行拆分为两行,但'\...<code>' 的技巧是让它在 SO 上清晰易读。)

于 2013-08-21T17:15:53.723 回答
7

上面给出并接受的--geometry答案在许多情况下根本不起作用......

在各种 StackExchange 站点和 AskUbuntu 上都有很多类似的问题,我最终找到的答案(在基于 Ubuntu 14.04 的 Linux Mint 发行版上)是使用wmctrl. 我留下一个答案,因为没有其他人在这个线程上提到它。

(如果你Devil's PieCompiz搜索那些,你会找到我正在谈论的问答)

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

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

一些有用的资源:

  • wmctrl手册页
  • 用户文档 1
  • 用户文档 2
  • “<a href="https://askubuntu.com/questions/31240/how-to-shift-applications-from-workspace-1-to-2-using-command">如何将应用程序从工作区 1 转移到 2使用命令?””</li>
  • 更具体的答案 RE:指定尺寸
  • “<a href="https://askubuntu.com/questions/739155/why-cant-i-move-a-window-to-the-top-left-corner-with-wmctrl-in-unity?atw= 1">如果您将窗口设置为最大化wmctrl,两者都可以正常工作。”</li> xdotool

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

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

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

于 2016-06-23T19:01:01.137 回答
4

用一个fifo

在您希望输出出现的监视器上打开一个终端窗口并执行

mkfifo /tmp/myfifo
cat /tmp/myfifo

然后在源终端上做

./myProject >/tmp/myfifo

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

于 2013-08-21T14:48:43.590 回答
4

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

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

echo $DISPLAY

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

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

DISPLAY=:0.1 ./my_app
于 2013-08-21T15:59:57.607 回答
0

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

于 2013-08-21T15:56:02.057 回答