在与启动它的位置相同的屏幕上打开应用程序窗口

我正在使用双屏幕设置。 Ubuntu 14.10 / Unity。 每个屏幕都有自己的启动器/短跑。 Firefox,nautilus,terminal和thunderbird等默认应用程序出现在我使用启动器的屏幕上。 所以..当我在右侧屏幕上使用Firefox的启动器时,浏览器会在右侧屏幕上打开。 应该如此。

我希望与谷歌浏览器等其他应用程序一样。 我似乎找不到合适的解决方案。

重定向命令以运行应用程序

大多数应用程序在它们启动的屏幕上打开它们的窗口(来自Dash或启动器)。 但是,有些应用程序没有,但可以强制它们通过重定向命令来通过下面的脚本运行应用程序。 为此,您需要编辑相应的.desktop文件(启动器)。

设置似乎有点复杂,但如果遵循程序(“如何使用”),它应该不会太困难。

这个怎么运作

  • 脚本在您单击启动器时读取鼠标位置或从Dash中选择应用程序,并确定在哪个屏幕上(左/右)。
  • 顺便说一下,它等待新窗口出现,由您启动的应用程序(pid)拥有。
  • 窗口出现后,它会检查窗口(屏幕)位置是否与鼠标(屏幕)初始位置匹配。
  • 如果没有,它会将窗口移动到您启动应用程序的屏幕。 在大多数情况下,动作将处于窗口存在的(非常)早期阶段,因此您甚至不会注意到它。

问题/解决方案

有一个缺点:如果您通过命令替换.desktop文件的命令来调用此脚本,右键单击“打开方式”将无法正常工作。 对于像Google Chrome这样的网络浏览器,这不会是一个太大的问题。 对于其他应用程序,一个简单的解决方案是添加选项以在当前屏幕上打开一个新窗口作为快捷方式(请参见下文)。

<图像/>“></p>
<h3> 如何使用: </h3>
<ul>
<li>
<p> 该脚本使用<code>wmctrl</code>和<code>xautomation</code> : </p>
<pre> <code>sudo apt-get install xautomation sudo apt-get install wmctrl</code> </pre>
</li>
<li>
<p> 如果目录尚未存在,请创建一个目录<code>~/bin</code> 。 </p>
</li>
<li>
<p> 将脚本复制到空文件中,将其保存为<code>~/bin</code> <code>open_oncurrent</code> (无扩展名) </p>
</li>
<li> 使其可执行(!) </li>
<li>
<p> 将相应的<code>.desktop</code>文件从<code>/usr/share/applications</code>复制到<code>~/.local/share/applications</code> : </p>
<pre> <code>cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop</code> </pre>
</li>
<li>
<p> 在<code>~/.local/share/applications</code>打开本地副本: </p>
<pre> <code>gedit ~/.local/share/applications/google-chrome.desktop</code> </pre>
</li>
<li>
<p> 编辑文件(两个选项): </p>
<ol>
<li>
<p> 要更改启动器的<em>主</em>命令: </p>
<ul>
<li>
<p> 找到这条线: </p>
<pre> <code>Exec=/usr/bin/google-chrome-stable %U</code> </pre>
</li>
<li>
<p> 改为 </p>
<pre> <code>Exec=/bin/bash -c

  • 要将选项添加为快捷方式(如上图所示):

    • 找到这条线:

       X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito; 
    • 替换为:

       X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen; 
    • 然后将以下部分添加到文件的最后:

       [New window on this screen Shortcut Group] Name=New window on this screen Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable" TargetEnvironment=Unity 
  • 如何与其他应用程序一起使用:

    同样,您可以将解决方案应用于其他应用程序。 在.desktop文件中使用的命令的语法就像示例:

     Exec=/bin/bash -c "open_oncurrent " 

    脚本中有关如何处理exception的一小部分解释。

    剧本

     #!/usr/bin/env python3 import subprocess import sys import time import getpass t = 0; user = getpass.getuser(); application = sys.argv[1] """ In most cases, the command to run an application is the same as the process name. There are however exceptions, to be listed below, if you use these appli- cations icw this script. Just add an item to the list in the format: ["", ""], """ exceptions = [ ["/usr/bin/google-chrome-stable", "chrome"], ] try: procname = [app[1] for app in exceptions if app[0] == application][0] except IndexError: procname = application get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8") # initial position of the mouse (click position) start_pos = int(get("xmousepos").strip().split()[0]) # x- position of right side of the screen x_res = [int(s.split("x")[0]) for s in get("xrandr").split() if s.endswith("+0+0")][0] # current windows start_windows = get("wmctrl -l") # open application subprocess.call(["/bin/bash", "-c", application+"&"]) while t < 30: procs = get("ps -u "+user).splitlines() new = [w for w in get("wmctrl -lpG").splitlines() if not w.split()[0] in start_windows] match = sum([[line for line in procs if w.split()[2] in line and procname[:15] in line] for w in new], []) if len(match) == 1: data = new[0].split(); curr_pos = int(data[3]); compare = (start_pos > x_res, curr_pos > x_res) if compare[0] == compare[1]: pass else: if compare[0] == True: data[3] = str(int(data[3])+x_res) else: data[3] = str(int(data[3])-x_res) cmd1 = "wmctrl -r "+data[0]+" -b remove,maximized_vert,maximized_horz" cmd2 = "wmctrl -ir "+data[0]+" -e 0,"+(",").join(data[3:7]) for cmd in [cmd1, cmd2]: subprocess.Popen(["/bin/bash", "-c", cmd]) break t = t + 1 time.sleep(0.5) 

    Unity使用Compiz作为组合管理器,它有各种各样的插件用于这种东西。 要在不乱写命令行的情况下轻松简短地讲故事,请安装Compiz Config设置管理器(使用sudo apt-get install compizconfig-settings-manager或通过软件中心),然后查找Place Windows ,确保选中它

    在此处输入图像描述

    在该插件下, Multi Output Mode将有多个选项。 你想要的是Use output device of focused window 。 因此,无论文件管理器在哪里,它都会打开文件窗口 在此处输入图像描述