Có cách nào để ngăn cửa sổ của bạn di chuyển khi màn hình ngoài được kết nối không?


9

Vì vậy, tôi đang sử dụng Ubuntu 14.10 trên máy tính xách tay của mình và thỉnh thoảng cắm nó vào TV cho màn hình thứ hai. TV của tôi ở bên trái bàn của tôi. Khi tôi kích hoạt nó như một màn hình ngoài ở bên trái màn hình máy tính xách tay của tôi, tất cả các cửa sổ trong màn hình máy tính xách tay của tôi chuyển sang màn hình TV. Tôi có thể di chuyển chúng trở lại, nhưng thật khó chịu khi phải làm như vậy mỗi lần, đặc biệt là khi có một vài cửa sổ mở.

TV bên trái

Tuy nhiên, các cửa sổ không di chuyển nếu tôi đặt màn hình TV ở bên phải màn hình máy tính xách tay của tôi (hầu như). Nhưng điều này dễ hiểu khi sử dụng vì nó trái ngược với thiết lập vật lý. Ngoài ra, tôi không muốn di chuyển bàn làm việc của mình.

TV bên phải

Có vẻ như Ubuntu hoặc máy chủ hiển thị chỉ đơn giản giả định rằng màn hình ngoài cùng bên trái là màn hình chính và là nơi tất cả các cửa sổ nên có. Có cách nào để vô hiệu hóa hành vi này?

Tôi đã kiểm tra các diễn đàn này nhưng thực sự chưa thấy ai đăng bài này. Chủ đề gần nhất tôi tìm thấy là cái này, mặc dù nó không hoàn toàn là vấn đề tương tự.

Yêu cầu Ubuntu KHÔNG di chuyển các cửa sổ khi tắt một trong nhiều màn hình

Còn ai có ý tưởng nào không? Xin vui lòng cho tôi biết nếu bạn làm. Cảm ơn!

Câu trả lời:


2

Tôi không tìm thấy cài đặt "bí mật" để thay đổi hành vi của hành vi được thiết kế. Có vẻ như màn hình bên trái được coi là màn hình "cơ sở".

Tuy nhiên, rất có thể tạo ra một cách giải quyết, với kết quả cơ bản giống nhau. Bạn có thể tạo một tập lệnh, nhân dịp kết nối màn hình thứ hai, liệt kê tất cả các cửa sổ. Sau đó, tất cả các cửa sổ được di chuyển ban đầu sang màn hình bên trái, được chuyển trở lại màn hình bên phải, trong vòng một hoặc hai giây. Kích thước của tất cả các cửa sổ sẽ được bảo tồn.
Đó là những gì kịch bản dưới đây làm.

Hai phiên bản

Bạn có thể khôi phục các cửa sổ được sắp xếp của mình theo hai cách:

  • Đôi khi, với một phím tắt để chạy sau khi màn hình thứ hai được kết nối.
  • Tự động, chạy tập lệnh ở chế độ nền, chờ màn hình của bạn được kết nối.

Cách sử dụng

chuẩn bị

  • Tải về wmctrl

    sudo apt-get cài đặt wmctrl

  • Tra cứu tên của hai màn hình của bạn với sự trợ giúp của xrandr, tên của các màn hình sẽ ở ngay trước từ "được kết nối".

  • Sao chép một trong các đoạn script bên dưới, trong phần đầu, thay thế trong hai dòng này tên màn hình bằng tên chính xác:

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

    lưu tập lệnh dưới dạng move_windows.py

  • Đảm bảo trong cài đặt hiển thị, màn hình phụ của bạn ở bên trái. Các dòng trên cùng của hai màn hình cần phải thẳng hàng (như trong hình ảnh đầu tiên của câu hỏi của bạn).

Chạy tập lệnh
- Nếu bạn sử dụng tập lệnh để thỉnh thoảng chạy, hãy chạy tập lệnh sau khi màn hình thứ hai của bạn được kết nối.

    python3 /path/to/move_windows.py

Bạn có thể muốn thêm nó vào một phím tắt nếu bạn nghĩ nó làm những gì cần làm, Chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:

  • Nếu bạn sử dụng một để chạy trong nền, cũng chạy nó bằng lệnh:

    python3 /path/to/move_windows.py
    

    Nếu nó hoạt động như bạn dự định, hãy thêm nó vào các ứng dụng khởi động của bạn: Dash> Ứng dụng khởi động> Thêm

Tôi đã thử kịch bản với máy tính xách tay của tôi (ở bên phải) và hai màn hình khác nhau (ở bên trái). Kết quả là giống nhau.

màn hình máy tính xách tay

nhập mô tả hình ảnh ở đây

kết nối mà không có kịch bản

nhập mô tả hình ảnh ở đây

kết nối với tập lệnh đang chạy

nhập mô tả hình ảnh ở đây

Sau khi kịch bản thực hiện công việc của nó, các cửa sổ sẽ "còn lại một mình" (tất nhiên) và bạn có thể sắp xếp các cửa sổ theo cách của mình.

Kịch bản

1. Phiên bản "Thủ công", để chạy sau khi màn hình được kết nối

#!/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. Phiên bản tự động, để chạy trong nền

#!/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

Kỹ năng bệnh nặng, Jacob!
don.joey 16/12/14

@ K0j0 Bạn có quản lý không?
Jacob Vlijm

@JacobVlijm Không chắc chắn nếu bỏ phiếu cứ sau 5 giây là giải pháp tốt nhất (có khả năng hướng sự kiện không?). Dù sao, nếu bạn quan tâm đến việc biến tập lệnh này thành một chỉ báo Unity ( như thế này ở đây ) thì hãy liên hệ.
Peterino

@Peterino Nếu tín hiệu hướng sự kiện tồn tại, đó sẽ là lựa chọn đầu tiên của tôi. Đồng thời: Nếu một kịch bản nền được viết tốt, thì gánh nặng bổ sung của nó sẽ (và có thể) thực tế là không có, và tôi luôn kiểm tra các kịch bản của mình một cách cụ thể về điều đó. Tôi tự chạy một số thay đổi của các kịch bản nền. Ngay cả tất cả cùng nhau không có tác dụng đáng chú ý nào. Hãy nhớ nhiều vòng lặp đang chạy theo định nghĩa trên hệ thống của bạn. Về đề xuất chỉ báo Unity: Tôi chắc chắn quan tâm đến việc tìm hiểu cách tạo chỉ báo, cho tình huống này hoặc tình huống khác :).
Jacob Vlijm

@JacobVlijm Có vẻ như vị trí tự động của các cửa sổ sẽ tự động bắt đầu với một trong những bản phát hành tiếp theo của Ubuntu ("công việc đang tiến hành"), theo một nguồn tin tại Canonical . Có lẽ không đáng để đầu tư trong vài tháng còn lại trên phiên bản hiện tại. Mặc dù vậy, tôi sẽ kiểm tra kỹ với các nhà phát triển Mir trên IRC # ubfox-mir @ freenode.
Peterino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.