如何在其他显示器上打开窗口?


9

到目前为止,我使用多台显示器来手动拖动窗口。在双头设置中,是否可以在特定屏幕上打开窗口?(不要与多个X服务器显示混淆。)

类似于:SCREEN=2 firefoxopen-in-screen 2 firefox

如果重要的话,我的环境是使用KWin窗口管理器的KDE。KWin窗口规则只能匹配某些属性,例如标题,但是我找不到环境变量作为过滤器。

辅助显示扩展了主屏幕:

$ xrandr -q
Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 32767 x 32767
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
   1600x900       60.1*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+1600+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)

2
通常,我建议为此使用kstart它,但它似乎kstart仅支持定义特定的桌面,而不支持应在其上启动应用程序的屏幕。可能值得在bugs.kde.org上发布愿望清单错误报告
Elias Probst 2013年

很棒的提示kstart,我也想知道。命令为:kstart --desktop $N firefox其中$N是1到虚拟桌面总数之间的数字。
Lekensteyn

关于KSTART,还有一个bug报告上bugs.kde.org要求此功能。
Elias Probst 2014年

真奇怪,我今天早些时候看到了有关wmctrl的帖子,但没有机会对其进行测试。为什么将其删除?
Lekensteyn 2014年

不知道关于wmctrl的帖子,没看到。
Elias Probst 2014年

Answers:


5

不,您不能直接这样做。在X体系结构中,应用程序无法识别您看到的两个物理监视器。您只能通过确定可见工作区的哪些区域与哪个监视器相对应,然后将窗口放置在正确的偏移位置来解决此抽象问题。

明智的工具包支持一个-geometry选项,该选项允许您的应用程序请求放置在特定位置。如果没有此选项,则可以使用wmctrl兼容EWMH / NetWM的X Window Manager来移动和调整现有窗口的大小(请参阅wmctrl(1),您需要选项-r-e)。我曾经使用devilspie过强制放置某些窗口的方法,当然您选择的窗口管理器可能具有自己的强制放置窗口的功能。

devilspie允许在X窗口上应用某些操作,并可以使用X窗口属性来识别不同的窗口和应用程序。您的关键规则是geometry "<width>x<height>+<xoffset>+<yoffset>"

但是,您始终需要计算另一台物理监视器在何时何地启动。但这并不太难,并且xrandr确实会告诉您它如何以及在何处使用"<width>x<height>+<xoffset>+<yoffset>以输出名称开头的每一行形式的监视器。

没有万无一失的方法,因为实现可能(而且确实!)会有所不同。wmctrl通常在窗口标题上工作以识别目标。devilspie也可以引用其类,但是,我不知道有任何工具包可以让您指定X Windows类,但不能指定其几何形状。

当然,您总是可以启动两个xephyr实例,并让一个填充您的左屏幕,另一个填充您的右屏幕,然后通过DISPLAY环境变量填充地址,但是此解决方案还有其他缺点。

从理论上讲,控制窗口放置的权限是窗口管理器。因此,如果您不希望窗口管理器执行某些操作,那将会很麻烦,这也是没有通用方法完成此操作的原因。

但是,如果您的具体用例是您的android模拟器...与要求SCREEN=n fooapp在shell 上指定选项有很大不同,那么devilspie您可能正在寻找。提示:我发现最好通过它们的窗口类来识别应用程序。


感谢您解释为什么这不是一个简单的功能。KWin还具有强制将其放置在其他屏幕上的窗口规则(这是我现在使用的)。虽然没有的默认功能SCREEN=x app,是否可以通过这种方式添加window属性,以便可以通过KWin对其进行过滤?
Lekensteyn 2014年

理论上是可以的,但是我不知道有任何现有的解决方案。我认为您不能添加属性,但是可以更改现有属性,因此您只需向kwin可以检测到的窗口类添加一些字符串即可。
Bananguin 2014年

我向您授予了赏金,因为SE可以将其授予投票最多的答案,而您的答案可以更好地描述问题。目前的答案仍然不令人满意。
Lekensteyn 2014年

4

这是特定于窗口管理器的解决方案。这就是如何使用KDE的默认窗口管理器kwin来完成的。

如果右键单击应用程序标题栏,然后选择更多设置->特殊应用程序设置。

转到窗口匹配选项卡。单击检测窗口属性按钮。然后用鼠标光标单击应用程序主窗口。它将选择窗口类等,还可以获得窗口定位信息等。

然后单击大小和位置选项卡。单击“框位置”和“框大小”,然后单击两者右侧的框,并设置为“记住”。

然后单击确定。

下次您运行该应用程序时,它的大小应相同且在同一台显示器上。

我在KDE中使用此功能在3显示器设置下在左侧显示器上打开uRxvt终端,并且每次都可以使用。

祝好运。


我现在就是这样做的,我希望有一种使用envvars的更直接的方法。
Lekensteyn 2014年

对于KDE KWin用户,这是正确的答案。
iLikeDirt

3

这取决于如何设置双显示器。

如果使用XINERAMA来使两个显示器看起来都像X一样,那么您可以使用该-geometry选项要求应用程序出现在特定位置。如果您将显示设置设置为不同的屏幕,则将使用DISPLAY来实现此目的。

试试看:

$ DISPLAY=0.0 xterm &
$ DISPLAY=0.1 xterm &

如果您的监视器是屏幕0和1,则应在每个监视器上生成一个xterm。


2
我已经尝试过此操作,但是此配置不适用于我,一个屏幕位于另一个屏幕的左侧。我会更新我的问题。
Lekensteyn

1
您是否尝试过在支持几何选项的应用程序中使用它?如果x坐标大于1600,则应将应用程序放置在第二个显示器空间中。您还可以按照我的经验在kwin之外尝试一下kwin(只是看看它是否有效),-geometry但并不总是能正常工作。
casey 2013年

Casey,我要定位的应用程序不支持这样的选项(emulator基于QEMU的android )。该程序将在我的鼠标光标所在的位置打开。
Lekensteyn

2

我也碰到过这种方法,它利用了xdotoolxprop,和wmctrl

以下脚本将执行以下操作:

  1. 查找活动窗口
  2. 获取其最大化状态并记住它
  3. 删除最大化
  4. 获取其几何
  5. 计算新职位
  6. 移动它
  7. 根据先前状态最大化
  8. 提高它
  9. 这是执行此操作的脚本:

脚本

这会将活动窗口移到另一个监视器。它只能并排处理。水平,显示器配置。

wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`

wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`

new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
  new_x=0
fi

xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
  wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi

xdotool windowraise $wid

来源: Xubuntu –在监视器之间移动窗口


这仅在打开应用程序后才起作用,而不是我真正想要的(尽管可能为此添加了键盘绑定)。如果我没记错的话,这总是在监视器的左侧放置一个窗口吗?
Lekensteyn 2014年

@Lekensteyn-是的,此解决方案的目的是启动appX,然后运行此cmd进行移动。我没有双显示器8-(所以我没有办法对其进行测试,我只是找到了它,并在此处提供了详细信息供您评估。这是一个选项,可能会进行修改,但这是其“原始”解决方案当前格式
slm

@Lekensteyn-此解决方案与您的SCREEN=2 appX概念没有太大不同,只是它是appX; sleep 1; moveWindow.sh
slm

@Lekensteyn-我还使用了devilspie,xdotool等来做完全相同的事情(在一个窗口内),这个A补充了另一个,因为它显示了细节,其中另一个仅解释了可能的方法,但是没有显示实际的实现细节。
slm

app & sleep 1; moveWindow.sh由于程序不会分离,因此更像是。我不认为这比使用KWin窗口规则更好。为您的努力+1。
Lekensteyn 2014年

0

遇到类似的问题。发现以下内容:

  1. 右键单击窗口标题栏,然后选择“更多操作”->“窗口管理器设置”。
  2. 在左侧的列中选择“焦点”。
  3. 切换选项“活动屏幕跟随鼠标”。

如果未指定其他默认值,则窗口将显示在当前活动的屏幕上。通过上述步骤,鼠标位置定义了此活动屏幕。


是的,但是如果我想将光标停留在当前屏幕上,这将不起作用。我认为这甚至是默认选项,但并非所有程序都尊重它。
Lekensteyn 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.