我已將 LCD 連接到我的筆記型電腦。當我嘗試在 Nautilus 中開啟檔案時,目標應用程式會在我的筆記型電腦顯示器中打開,而不是在第二個顯示器(其中打開了 nautilus 視窗)中。
我不想更改預設顯示。我想在我正在工作的顯示器中開啟視窗。如果我的檔案管理器位於外部顯示器中,我希望在那裡開啟檔案。
的輸出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 組合存在輕微不相容性,在某些情況下可能會出現「特殊情況」。如果沒有可用的“乾淨”選項(修復),您可以使用下面的解決方法。
它存在一個後台腳本,尋找新的視窗出現。如果存在新窗口,腳本會將窗口位置與當前滑鼠位置進行比較。如果滑鼠和新視窗不在同一畫面上,則使用xdotool
windowmove 指令移動視窗。
背景腳本是個壞主意嗎?
如果您不需要後台腳本,請不要使用它。
同時:如果它添加了重要的功能和/或節省了您的時間,那麼不這樣做就太愚蠢了,如果劇本組織得很好,因此“燃料不足”。
作為參考:在我的筆記型電腦和桌上型電腦上,我不斷運行至少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"