在启动它的同一屏幕上打开应用程序窗口


8

我正在使用双屏设置。Ubuntu 14.10 / Unity。每个屏幕都有自己的启动器/仪表板。我使用启动器的屏幕上出现了诸如Firefox,鹦鹉螺,终端和雷鸟之类的默认应用。所以..当我在右侧屏幕上使用Firefox启动器时,浏览器会在右侧屏幕上打开。应该的。

我希望其他应用程序(例如Google Chrome)具有这种行为。我似乎找不到合适的解决方案。

Answers:


5

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

大多数应用程序在其启动屏幕(从Dash或启动器)中打开其窗口。但是,某些应用程序没有这样做,但是可以通过以下脚本将命令重定向到运行该应用程序的方式来强制使用它们。为此,您将需要编辑相应的.desktop文件(启动器)。

设置似乎有点复杂,但是如果遵循该过程(“如何使用”),则应该一点也不困难。

怎么运行的

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

问题/解决方案

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

<图像>

如何使用:

  • 该脚本同时使用wmctrlxautomation

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • 创建目录(~/bin如果尚不存在)。

  • 将脚本复制到一个空文件中,将其另存为open_oncurrent(无扩展名)~/bin

  • 使它可执行(!)
  • 将相应的.desktop文件从复制/usr/share/applications~/.local/share/applications

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
    
  • 在以下位置打开本地副本~/.local/share/applications

    gedit ~/.local/share/applications/google-chrome.desktop
    
  • 编辑文件(两个选项):

    1. 更改启动器的主要命令:

      • 找到这行:

        Exec=/usr/bin/google-chrome-stable %U
        
      • 更改为

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. 要将选项添加为快捷方式(如上图所示):

      • 找到这行:

        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 <command>"

脚本中还提供了有关如何处理异常的少量补充说明。

剧本

#!/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 i.c.w. this script. Just add an item to the list in the format:
["<command>", "<process_name>"],
"""
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)

谢谢,这有效。打开后,我确实在启动器上看到了第二个Google Chrome图标。
Digiplace

6

Unity将Compiz用作撰写管理器,并且具有用于这类内容的各种插件。为了使简短的故事变得简短而又不会弄乱命令行,请安装Compiz Config设置管理器(使用sudo apt-get install compizconfig-settings-manager或通过Software Center进行安装),然后查找Place Windows,确保已选中

在此处输入图片说明

在该插件下,将有多个选项Multi Output Mode。你想要的是Use output device of focused window。因此,它将在您的文件管理器所在的位置放置打开文件窗口 在此处输入图片说明

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.