노트북에 LCD를 연결했습니다. 노틸러스에서 파일을 열려고 하면 대상 응용 프로그램이 두 번째 디스플레이(노틸러스 창이 열려 있는)가 아닌 내 노트북 디스플레이에서 열립니다.
기본 디스플레이를 변경하고 싶지 않습니다. 작업 중인 디스플레이에서 창을 열고 싶습니다. 파일 관리자가 노트북 디스플레이에 있는 경우 앱이 노트북 디스플레이에서 열리도록 하고 싶습니다. 내 파일 관리자가 외부 디스플레이에 있는 경우 그곳에서 파일을 열 것으로 예상됩니다.
의 출력xrandr
Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
eDP1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 256mm x 144mm
1366x768 60.1*+
1360x768 59.8 60.0
1024x768 60.0
800x600 60.3 56.2
640x480 59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+1366+0 (normal left inverted right x axis y axis) 527mm x 296mm
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
1280x800 59.9
1152x864 75.0
1280x720 60.0 50.0 59.9
1440x576i 50.1
1024x768 75.1 70.1 60.0
1440x480i 60.1 60.1
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)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
답변1
설명하는 동작(현재 화면에서 창 열기)~해야 한다기본 동작이 되십시오. 내 14.04에서는 그렇습니다.
일부 그래픽 드라이버/GPU 조합과의 사소한 비호환성으로 인해 경우에 따라 "특이성"이 발생할 수 있습니다. 사용 가능한 "정리" 옵션(수정)이 없는 경우 아래 해결 방법을 사용할 수 있습니다.
나타날 새 창을 찾는 백그라운드 스크립트가 존재합니다. 새 창이 존재하는 경우 스크립트는 창 위치를 현재 마우스 위치와 비교합니다. 마우스와 새 창이 모두 같은 화면에 있지 않으면 windowmove` xdotool
명령을 사용하여 창을 이동합니다.
배경 스크립트는 나쁜 생각인가요?
백그라운드 스크립트가 필요하지 않으면 사용하지 마세요.
동시에 중요한 기능을 추가하거나 시간을 절약한다면 그렇게 하지 않는 것이 어리석은 일입니다.만약에스크립트는 잘 구성되어 있으므로 "연료가 부족합니다".
참고로 저는 노트북과 데스크톱 모두에서 끊임없이 실행합니다.적어도5개의 백그라운드 스크립트 + 때때로 테스트 목적으로 추가 스크립트어느알아채다.
연료를 절약하기 위해 취하는 조치:
- 스크립트에는 가변 루프 주기가 있습니다.
10초에 한 번씩 스크립트는 두 번째 화면이 연결되는지 확인합니다. 그렇지 않은 경우 스크립트는 전체 창 확인 절차를 건너뛰고 10초 후에 다시 확인합니다. 이는 스크립트가오직두 번째 화면이 연결되면 작동합니다. 두 번째 화면이 연결되면 10초 이내에 루프가 2초 주기로 변경됩니다. - 스크립트가 수행하는 모든 (다음) 작업은 조건부입니다.
예를 들어 마우스 위치는오직확인됨만약에새 창문 등이 있습니다.
모두 합쳐서 내 시스템에서는 알아차릴 수도 측정할 수도 없었습니다.어느스크립트의 결과로 인한 추가 로드.
스크립트
#!/usr/bin/env python3
import subprocess
import time
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def screen_limit():
screendata = [s for s in get("xrandr").split() if s.count("+") == 2]
if len(screendata) == 2:
return int([s.split("x")[0] for s in screendata if "+0+0" in s][0])
wd1 = get(["wmctrl", "-lG"])
t = 0
while True:
time.sleep(2)
# once per 10 seconds, check for a second screen
if t == 0:
while True:
rightside = screen_limit()
# if no second screen, skip the procedure
if rightside == None:
time.sleep(10)
else:
break
wd2 = get(["wmctrl", "-lG"])
# check for buggy wmctrl
if all([wd2 != None, wd1 != None]):
wins = [w.split() for w in wd2.splitlines()]
# check for new windows
relevant = [w for w in wins if not w[0] in wd1]
if relevant:
# if new windows appeared, see if they match the mouse pos
mousepos = int(get([
"xdotool", "getmouselocation"
]).split()[0].split(":")[1])
for w in relevant:
check = [mousepos < rightside, int(w[2]) < rightside]
if check[0] != check[1]:
# if mouse and window are not on the same screen > move
if check[0] == False:
cmd = ["xdotool", "windowmove", w[0],
str(int(w[2]) + rightside), w[3]]
else:
cmd = ["xdotool", "windowmove", w[0],
str(int(w[2]) - rightside), w[3]]
subprocess.Popen(cmd)
wd1 = wd2
t = 0 if t == 10 else t
t += 1
사용하는 방법
스크립트에는
wmctrl
및 가 모두 필요합니다xdotool
. 터미널에서 실행:sudo apt-get install xdotool wmctrl
- 스크립트를 빈 파일에 복사하고 다른 이름으로 저장하세요.
move_windows.py
테스트 - 다음 명령으로 스크립트를 실행합니다.
python3 /path/to/move_windows.py
모든 것이 예상대로 작동하면 시작 응용 프로그램(Dash > 시작 응용 프로그램 > 추가)에 추가하세요. 다음 명령을 추가합니다.
/bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"