มีวิธีการป้องกันไม่ให้หน้าต่างของคุณเคลื่อนไหวเมื่อเชื่อมต่อจอภาพภายนอกหรือไม่?


9

ดังนั้นฉันใช้ Ubuntu 14.10 บนแล็ปท็อปของฉันและบางครั้งก็เสียบเข้ากับทีวีของฉันสำหรับหน้าจอที่สอง ทีวีของฉันอยู่ทางซ้ายของโต๊ะ เมื่อฉันเปิดใช้งานเป็นจอภาพภายนอกทางด้านซ้ายของหน้าจอแล็ปท็อปของฉันหน้าต่างทั้งหมดที่อยู่ในหน้าจอแล็ปท็อปของฉันเลื่อนไปที่หน้าจอทีวี ฉันสามารถย้ายพวกมันกลับมาได้ แต่มันน่ารำคาญจริงๆที่ต้องทำทุกครั้งโดยเฉพาะเมื่อมีหน้าต่างหลายบานที่เปิดอยู่

ทีวีทางซ้าย

หน้าต่างไม่ขยับอย่างไรก็ตามถ้าฉันตั้งค่าหน้าจอทีวีทางด้านขวาของหน้าจอแล็ปท็อปของฉัน (จริง) แต่สิ่งนี้ทำให้เกิดความสับสนในการใช้งานเนื่องจากเป็นสิ่งที่ตรงกันข้ามกับการตั้งค่าทางกายภาพ นอกจากนี้ฉันไม่ต้องการย้ายโต๊ะทำงาน

ทีวีด้านขวา

ดูเหมือนว่า Ubuntu หรือเซิร์ฟเวอร์ดิสเพลย์จะสันนิษฐานว่าจอภาพซ้ายสุดเป็นหน้าต่างหลักและหน้าต่างทุกบานควรอยู่ที่ใด มีวิธีปิดใช้งานพฤติกรรมนี้หรือไม่

ฉันตรวจสอบฟอรัมเหล่านี้แล้ว แต่ยังไม่เคยเห็นใครโพสต์เกี่ยวกับเรื่องนี้ เธรดที่ใกล้เคียงที่สุดที่ฉันพบคืออันนี้แม้ว่าจะไม่ใช่ปัญหาเดียวกัน

รับ Ubuntu เพื่อไม่ย้ายหน้าต่างเมื่อปิดหนึ่งในหลาย ๆ จอภาพ

ใครมีความคิดเห็นบ้าง โปรดแจ้งให้เราทราบหากคุณทำ ขอบคุณ!

คำตอบ:


2

ฉันไม่พบการตั้งค่า "ความลับ" เพื่อเปลี่ยนพฤติกรรมของการออกแบบพฤติกรรมตามที่ดูเหมือน ดูเหมือนว่าหน้าจอด้านซ้ายถือว่าเป็นหน้าจอ "ฐาน"

อย่างไรก็ตามมีความเป็นไปได้ที่จะสร้างวิธีแก้ปัญหาได้เป็นอย่างดีโดยมีผลลัพธ์เหมือนกัน คุณสามารถสร้างสคริปต์ที่แสดงรายการหน้าต่างทั้งหมดในบางโอกาส ต่อจากนั้นหน้าต่างทั้งหมดที่ถูกย้ายในขั้นต้นไปยังหน้าจอด้านซ้ายจะถูกเลื่อนกลับไปที่หน้าจอด้านขวาภายในหนึ่งหรือสองวินาที ขนาดของหน้าต่างทั้งหมดจะถูกรักษาไว้
นั่นคือสิ่งที่สคริปต์ด้านล่างทำ

สองรุ่น

คุณสามารถคืนค่าหน้าต่างที่จัดเรียงไว้ได้สองวิธี:

  • เป็นครั้งคราวด้วยปุ่มลัดที่จะเรียกใช้หลังจากเชื่อมต่อกับหน้าจอที่สอง
  • เรียกใช้สคริปต์ในพื้นหลังโดยอัตโนมัติรอให้หน้าจอของคุณเชื่อมต่อ

วิธีใช้

การเตรียมการ

  • ติดตั้ง 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

ทักษะที่แสนสาหัสยาโคบ!
don.joey

@ K0j0 คุณจัดการเหรอ?
Jacob Vlijm

@JacobVlijm ไม่แน่ใจว่าการสำรวจทุก ๆ 5 วินาทีเป็นทางออกที่ดีที่สุดหรือไม่? อย่างไรก็ตามหากคุณสนใจที่จะเปลี่ยนสคริปต์นี้เป็นตัวบ่งชี้ Unity ( เช่นที่นี่ ) โปรดติดต่อเรา
Peterino

@Peterino หากมีสัญญาณที่ขับเคลื่อนโดยเหตุการณ์มันจะเป็นตัวเลือกแรกของฉัน ในเวลาเดียวกัน: หากสคริปต์พื้นหลังเขียนได้ดีภาระเพิ่มเติมที่ควร (และสามารถ) ไม่สามารถทำได้จริงและฉันจะทดสอบสคริปต์ของฉันโดยเฉพาะในเรื่องนั้น ฉันรันสคริปต์พื้นหลังที่เปลี่ยนแปลงจำนวนมากด้วยตนเอง แม้ทั้งหมดเข้าด้วยกันจะไม่มีผลกระทบใด ๆ ที่เห็นได้ชัดเจน จำลูปจำนวนมากกำลังทำงานโดยคำจำกัดความในระบบของคุณ เกี่ยวกับข้อเสนอแนะของตัวบ่งชี้ความสามัคคี: ฉันแน่นอนความสนใจในการเรียนรู้วิธีการสร้างตัวบ่งชี้ทั้งสำหรับสถานการณ์นี้หรืออีก :)
Jacob Vlijm

หน้าตา @JacobVlijm เช่นตำแหน่งอัตโนมัติของหน้าต่างที่จะเกิดขึ้นโดยอัตโนมัติเริ่มต้นด้วยหนึ่งในรุ่นต่อไปของอูบุนตู ( "การทำงานในความคืบหน้า") ตามแหล่งที่ Canonical อาจไม่คุ้มค่าที่จะลงทุนในอีกไม่กี่เดือนที่เหลือในรีลีสปัจจุบัน ฉันจะตรวจสอบอีกครั้งกับผู้พัฒนา Mir บน IRC # ubuntu-mir @ freenode
Peterino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.