외부 모니터가 연결되어있을 때 창문이 움직이지 않도록하는 방법이 있습니까?


9

그래서 랩톱에서 Ubuntu 14.10을 사용하고 때로는 두 번째 화면을 위해 TV에 연결합니다. 내 TV는 책상 왼쪽에 있습니다. 랩톱 화면 왼쪽의 외부 모니터로 사용하도록 설정하면 랩톱 화면에 있던 모든 창이 TV 화면으로 이동합니다. 나는 그들을 다시 움직일 수 있지만, 특히 여러 개의 창이 열려있을 때마다 그렇게해야한다는 것은 정말 성가신 일입니다.

왼쪽의 TV

그러나 TV 화면을 랩톱 화면 오른쪽 (가상)으로 설정하면 창이 움직이지 않습니다. 그러나 실제 설정과 반대이므로 사용하기가 혼란 스럽습니다. 또한 책상을 옮기고 싶지 않습니다.

오른쪽에 TV

우분투 또는 디스플레이 서버는 가장 왼쪽 모니터가 기본 모니터이며 모든 창이 있어야한다고 가정합니다. 이 동작을 비활성화하는 방법이 있습니까?

나는이 포럼을 확인했지만 실제로 이것에 대해 게시 한 사람을 보지 못했습니다. 내가 찾은 가장 가까운 스레드는 이것과 같지만 동일한 문제는 아닙니다.

여러 모니터 중 하나를 끌 때 우분투가 창을 움직이지 않도록하십시오.

누구든지 아이디어가 있습니까? 당신이 할 경우 알려 주시기 바랍니다. 감사!

답변:


2

디자인 된 동작의 동작을 변경하는 "비밀"설정을 찾지 못했습니다. 마치 왼쪽 화면이 "기본"화면 인 것처럼 보입니다.

그러나 기본적으로 동일한 결과로 해결 방법을 만드는 것이 가능합니다. 두 번째 화면을 연결할 때 모든 창을 나열하는 스크립트를 만들 수 있습니다. 결과적으로 처음에 왼쪽 화면으로 이동 한 모든 창은 1-2 초 안에 오른쪽 화면으로 다시 이동합니다. 모든 창의 크기가 유지됩니다.
이것이 아래 스크립트가하는 일입니다.

두 가지 버전

정렬 된 창을 두 가지 방법으로 복원 할 수 있습니다.

  • 때로는 두 번째 화면이 연결된 후 바로 가기 키를 사용하여 실행할 수 있습니다.
  • 자동으로 백그라운드에서 스크립트를 실행하고 화면이 연결될 때까지 기다립니다.

사용하는 방법

준비

  • 설치 wmctrl

    sudo apt-get 설치 wmctrl

  • 의 도움으로 두 화면의 이름을 찾으십시오. 화면 xrandr이름은 "connected"라는 단어 바로 앞에 있습니다.

  • 복사 아래 스크립트 중 하나 인 헤드 섹션에서이 두 줄에서 화면 이름을 올바른 이름으로 바꿉니다.

    screen_1 = "LVDS1"     # your main screen (laptop)
    screen_2 = "VGA1"      # secundary screen (on the left)
    

    스크립트를 다음과 같이 저장하십시오 move_windows.py

  • 디스플레이 설정에서 보조 화면이 왼쪽에 있는지 확인하십시오. 두 화면의 맨 위 줄은 문제의 첫 번째 이미지와 같이 일직선이되어야합니다.

스크립트 실행
- 스크립트 를 사용하여 가끔 실행하는 경우 두 번째 화면이 연결된 후 실행하십시오.

    python3 /path/to/move_windows.py

해야 할 일을한다고 생각되면 바로 가기 키에 키보드를 추가 할 수 있습니다. 시스템 설정> "키보드"> "바로 가기"> "사용자 정의 바로 가기"를 선택하십시오. "+"를 클릭하고 다음 명령을 추가하십시오.

  • 하나를 사용하여 백그라운드에서 실행하는 경우 다음 명령으로도 실행하십시오.

    python3 /path/to/move_windows.py
    

    의도 한대로 작동하면 시작 응용 프로그램에 추가하십시오 : Dash> Startup Applications> Add

랩탑 (오른쪽)과 두 개의 다른 화면 (왼쪽)으로 스크립트를 테스트했습니다. 결과는 같습니다.

노트북 화면

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

스크립트없이 연결

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

실행중인 스크립트와 연결

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

스크립트가 작업을 마치면 창은 물론 "혼자 남게"되고 창을 원하는대로 배열 할 수 있습니다.

스크립트

1. "수동"버전, 화면이 연결된 후 실행

#!/usr/bin/env python3
import subprocess
import time

#--
screen_2 = "LVDS1"       # replace with your internal screen (right)
screen_2 = "VGA1"        # replace with your external screen (left)
#--

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shift(xr_output):
    lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows(shift):
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    relevant = []
    for w in w_data:
        props = get("xprop -id "+w[0])
        if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])

shift_windows(get_shift(get("xrandr")))

2. 백그라운드에서 실행되는 자동 버전

#!/usr/bin/env python3
import subprocess
import time

#--
screen_2 = "LVDS1"       # replace with your internal screen (right)
screen_2 = "VGA1"        # replace with your external screen (left)
#--

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shift(xr_output):
    lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows(shift):
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    relevant = []
    for w in w_data:
        props = get("xprop -id "+w[0])
        if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])

while True:
    try:
        screen_info1 = get("xrandr")
        time.sleep(5)
        screen_info2 = get("xrandr")
        check = screen_2+" connected"
        if (check in screen_info1, check in screen_info2) == (False, True):
            time.sleep(5)
            shift_windows(get_shift(screen_info2))
    except:
        pass

정말 아픈 기술 야곱!
don.joey

@ K0j0 관리 했습니까?
Jacob Vlijm

@JacobVlijm 5 초마다 폴링이 최상의 솔루션인지 확실하지 않습니다 (이벤트 기반 가능성이 없습니까?). 어쨌든이 스크립트를 Unity 표시기 ( 여기와 같이 ) 로 바꾸고 싶다면 연락하십시오.
Peterino

@Peterino 이벤트 중심의 신호가 존재한다면, 그것이 나의 첫번째 선택 일 것입니다. 동시에 : 경우 백그라운드 스크립트가 잘 기록, 그 추가 부담 (수) 실질적으로 아무도 없을 것, 나는 항상에 특별히 내 스크립트를 테스트합니다. 나는 배경 스크립트의 수를 바꾸고있다. 모두 함께 눈에 띄는 효과는 없습니다. 시스템에서 수많은 루프가 정의에 따라 실행되고 있음을 기억하십시오. Unity 지표 제안에 대해 : 나는 이 상황이나 다른 상황에서 지표를 만드는 방법을 배우는 데 분명히 관심이 있습니다. :).
Jacob Vlijm

@JacobVlijm Canonical의 소식통에 따르면 다음 우분투 릴리스 ( "작업 진행 중") 중 하나부터 시작하여 자동으로 창을 자동 배치하는 것처럼 보입니다 . 현재 릴리스에 남은 몇 개월 동안 투자 할 가치가 없을 것입니다. 그래도 IRC # ubuntu-mir @ freenode에서 Mir 개발자와 다시 확인하겠습니다.
Peterino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.