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
kết nối mà không có kịch bản
kết nối với tập lệnh đang chạ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