ฉันไม่พบการตั้งค่า "ความลับ" เพื่อเปลี่ยนพฤติกรรมของการออกแบบพฤติกรรมตามที่ดูเหมือน ดูเหมือนว่าหน้าจอด้านซ้ายถือว่าเป็นหน้าจอ "ฐาน"
อย่างไรก็ตามมีความเป็นไปได้ที่จะสร้างวิธีแก้ปัญหาได้เป็นอย่างดีโดยมีผลลัพธ์เหมือนกัน คุณสามารถสร้างสคริปต์ที่แสดงรายการหน้าต่างทั้งหมดในบางโอกาส ต่อจากนั้นหน้าต่างทั้งหมดที่ถูกย้ายในขั้นต้นไปยังหน้าจอด้านซ้ายจะถูกเลื่อนกลับไปที่หน้าจอด้านขวาภายในหนึ่งหรือสองวินาที ขนาดของหน้าต่างทั้งหมดจะถูกรักษาไว้
นั่นคือสิ่งที่สคริปต์ด้านล่างทำ
สองรุ่น
คุณสามารถคืนค่าหน้าต่างที่จัดเรียงไว้ได้สองวิธี:
- เป็นครั้งคราวด้วยปุ่มลัดที่จะเรียกใช้หลังจากเชื่อมต่อกับหน้าจอที่สอง
- เรียกใช้สคริปต์ในพื้นหลังโดยอัตโนมัติรอให้หน้าจอของคุณเชื่อมต่อ
วิธีใช้
การเตรียมการ
ติดตั้ง wmctrl
sudo apt-get install wmctrl
ค้นหาชื่อสองหน้าจอของคุณด้วยความช่วยเหลือxrandr
ชื่อของหน้าจอจะอยู่ต่อหน้าคำว่า "เชื่อมต่อ"
คัดลอกหนึ่งในสคริปต์ด้านล่างในส่วนหัวแทนที่ในสองบรรทัดเหล่านี้ชื่อหน้าจอโดยคนที่ถูกต้อง:
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> แอปพลิเคชันเริ่มต้น> เพิ่ม
ฉันทดสอบสคริปต์ด้วยแล็ปท็อปของฉัน (ด้านขวา) และสองหน้าจอที่แตกต่างกัน (ด้านซ้าย) ผลลัพธ์ก็เหมือนกัน
หน้าจอแล็ปท็อป
การเชื่อมต่อโดยไม่มีสคริปต์
เชื่อมต่อกับสคริปต์ทำงาน
หลังจากที่สคริปต์ทำงานได้แล้ว Windows จะถูก "ทิ้งไว้ตามลำพัง" (แน่นอน) และคุณสามารถจัดเรียงหน้าต่างได้ตามที่คุณต้องการ
สคริปต์
1. รุ่น "Manual" เพื่อเรียกใช้หลังจากที่หน้าจอเชื่อมต่อ
#!/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