Tôi đã cố gắng sử dụng wmctrl
lệnh chuyển đổi, nhưng nó không hoạt động trên Ubuntu của tôi được thiết lập. Chuyển đổi sẽ bật, nhưng không tắt. (Tôi nghĩ rằng đó có thể là do tôi đang sử dụng môi trường máy tính để bàn gnome, trên đó wmctrl
AFAIK bị hỏng nhẹ).
Dù sao, sau rất nhiều nghiên cứu và tìm ra cách viết mã phù hợp trong bash, tôi đã tạo một lệnh duy nhất sử dụng các wmctrl
lệnh trong một lớp logic để chuyển trạng thái 'luôn ở trên đỉnh' một cách hiệu quả trên màn hình nền Gnome hiện tại. Tôi đã đăng câu trả lời này lên Ask Unix / Linux, nhưng nghĩ rằng tôi cũng sẽ đăng nó ở đây trong trường hợp bất kỳ ai cũng gặp vấn đề tương tự.
Đây là lệnh:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
Nó kiểm tra thuộc tính trạng thái cửa sổ đang hoạt động "_NET_WM_STATE" bằng cách sử dụng xprops
và nếu nó chứa văn bản "TRÊN" có nghĩa là tùy chọn 'luôn ở trên cùng' đang hoạt động. Sau đó, nó chỉ chạy wmctrl
lệnh với tham số add
hoặc remove
khi thích hợp.
Phân tích lệnh (mỗi lệnh được chèn vào phần tiếp theo, thay thế ■
trình giữ chỗ):
Nhận id cửa sổ hoạt động:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Lấy trạng thái cửa sổ từ xprop
việc sử dụng id:
xprop -id $(■) _NET_WM_STATE
Kiểm tra xem trạng thái có chứa "TRÊN" hay không, cho biết cửa sổ được đặt thành "luôn ở trên cùng":
[[ $(■) =~ "ABOVE" ]]
Trả về "xóa" nếu đúng, nếu không thì trả về "thêm":
■ && echo "remove" || echo "add"
chạy wmctrl
lệnh bằng cách sử dụng giá trị trả về làm tham số:
wmctrl -r :ACTIVE: -b $(■),above
Gửi toàn bộ để bash
bạn có thể sử dụng thay thế lệnh ${ ... }
, đánh giá boolean [[ ... ]]
và toán tử khớp regex =~
:
bash -c '■'
Bước cuối cùng này đặc biệt khiến tôi mất một thời gian rất dài để tìm ra. Cho đến khi tôi nhận ra rằng các phím tắt không chạy trong bash theo mặc định, tôi không biết tại sao các lệnh lại hoạt động trong bảng điều khiển khi tôi đang kiểm tra chúng nhưng lại âm thầm thất bại khi chạy trực tiếp như một phím tắt. Nó đưa tôi lên tường từ lâu!
Lưu ý: vì bạn cần các trích dẫn xung quanh lệnh bạn đang gửi đến bash, tôi phải cẩn thận khi viết lệnh mà tôi chưa bao giờ đi sâu hơn một cấp độ sâu hơn (sử dụng dấu ngoặc kép). Bất kỳ sự lồng ghép nào nữa của chuỗi trong dấu ngoặc kép sẽ yêu cầu rất nhiều dấu gạch chéo ngược khó hiểu để thoát dấu ngoặc kép.