시작된 화면과 동일한 화면에서 응용 프로그램 창 열기


8

이중 화면 설정을 사용하고 있습니다. 우분투 14.10 / 유니티. 각 화면에는 자체 실행기 / 대시가 있습니다. Firefox, nautilus, terminal & thunderbird와 같은 기본 응용 프로그램이 실행기를 사용한 화면에 나타납니다. 오른쪽 화면에서 Firefox 용 런처를 사용하면 오른쪽 화면에서 브라우저가 열립니다. 그렇습니다.

Chrome과 같은 다른 응용 프로그램 에서이 동작을 원합니다. 적절한 해결책을 찾지 못하는 것 같습니다.

답변:


5

응용 프로그램을 실행하도록 명령 재 지정

대부분의 응용 프로그램은 시작된 화면 (대시 또는 실행기)에서 창을 엽니 다. 그러나 일부 응용 프로그램은 아래 스크립트를 통해 응용 프로그램을 실행하도록 명령을 리디렉션하여 강제로 실행할 수는 없습니다. 그렇게하려면 해당 .desktop파일 (런처) 을 편집해야합니다 .

설정이 약간 복잡해 보이지만 절차를 따르는 경우 ( "사용 방법") 전혀 어렵지 않아야합니다.

작동 원리

  • 스크립트는 실행기를 클릭하는 순간 마우스 위치를 읽거나 Dash에서 응용 프로그램을 선택하고 어느 화면에서 왼쪽 / 오른쪽을 결정합니다.
  • 그런 다음 시작한 응용 프로그램 (pid)이 소유 한 새 창이 나타날 때까지 기다립니다.
  • 창이 나타나면 창 (화면) 위치가 마우스 (화면) 위치와 일치하는지 확인합니다.
  • 그렇지 않으면 창을 응용 프로그램을 시작한 화면으로 이동합니다. 대부분의 경우 작업은 창 존재의 (매우) 초기 단계에 있으므로 눈치 채지 못할 것입니다.

문제 / 해결책

한 가지 단점이 있습니다. 이 스크립트를 호출하는 명령으로 .desktop파일의 기본 명령을 바꾸면 마우스 오른쪽 단추로 "Open with" 가 제대로 작동하지 않습니다. 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)

감사합니다. 런처가 열려 있으면 Chrome의 두 번째 아이콘이 표시됩니다.
Digiplace

6

Unity는 Compiz를 작성 관리자로 사용하며 이러한 종류의 플러그인을 모두 갖추고 있습니다. 명령 줄을 엉망으로 만들지 않고 쉽고 긴 이야기를 짧게 만들려면 Compiz Config Settings Manager ( sudo apt-get install compizconfig-settings-managerSoftware Center 포함 또는 설치)를 설치 하고를 Place Windows확인하십시오.

여기에 이미지 설명을 입력하십시오

해당 플러그인에는에 대한 몇 가지 옵션이 Multi Output Mode있습니다. 당신이 원하는 것은 Use output device of focused window입니다. 따라서 파일 관리자가 어디에 있든 열린 파일 창을 배치합니다 여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.