Những gì bạn yêu cầu thực sự là cho phép cửa sổ của một ứng dụng cụ thể chỉ xuất hiện ở vị trí đầu tiên hoặc cuối cùng, z-khôn ngoan.
Khi cửa sổ gedit (trong ví dụ này) mất tiêu điểm, nó sẽ được gửi đến bài thơ cuối cùng (z-khôn, bên dưới cửa sổ đầu cuối bán trong suốt) thay vì chỉ giảm một vị trí :
Vị trí Z của cửa sổ
Trong khi nó có thể được thực hiện, chúng ta vẫn phải khắc phục một số biến chứng nghiêm trọng; Khi cửa sổ được gửi đến vị trí cuối cùng, bạn sẽ muốn giữ thứ tự z của tất cả các cửa sổ khác. Tuy nhiên, hiện tại, không có công cụ nào có thể cung cấp cho chúng tôi thứ tự z này của các cửa sổ. Cả hai xdotool
và wmctrl
cho chúng tôi không có thông tin về bất cứ điều gì.
Tuy nhiên, những gì chúng ta có thể làm là theo dõi lịch sử tập trung của (tất cả) các cửa sổ. Vì một cửa sổ hạ xuống một vị trí nếu một cửa sổ khác lấy nét, chúng ta có thể kết luận thứ tự z của các cửa sổ nếu chúng ta chạy một kịch bản nền để xem lịch sử lấy nét của các cửa sổ.
Giải pháp hai tập lệnh nền nhỏ
Giải pháp dưới đây tồn tại của hai tập lệnh nền nhỏ, để chạy đồng thời.
- Một kịch bản để theo dõi lịch sử tập trung:
focus_history.py
- Một tập lệnh để gửi cửa sổ của ứng dụng được nhắm mục tiêu đến vị trí cuối cùng nếu nó mất tiêu điểm:
set_z.py
Kịch bản 1
tập trung-history
#!/usr/bin/env python3
import subprocess
import time
import os
rootdata = os.environ["HOME"]+"/.focus_history"
open(rootdata, "wt").write("This is an empty line")
def current_windows():
try:
return subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8")
except subprocess.CalledProcessError:
pass
def convert_format(w_id):
return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
def read_data():
return open(rootdata).read().splitlines()
def get_top(wlist):
try:
top = convert_format(
[l.split("#")[-1].strip() for l in subprocess.check_output(
["xprop", "-root"]
).decode("utf-8").splitlines() \
if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0])
return [l for l in wlist if top in l][0]
except IndexError:
pass
if __name__ == "__main__":
while True:
time.sleep(1)
wdata = current_windows()
if wdata != None:
wlist = wdata.splitlines()
# get frontmost window (as in wmctrl -lG)
top = get_top(wlist)
oldlist = read_data()
if not any([top == oldlist[0], top == None]):
# clean up closed windows
[oldlist.remove(l) for l in oldlist if not l.split()[0] in wdata]
# remove possible other mentions of the active window
[oldlist.remove(l) for l in oldlist if l.startswith(top.split()[0])]
open(rootdata, "wt").write(("\n").join([top]+oldlist))
Kịch bản 2
#!/usr/bin/python3
import subprocess
import time
import focus_history
# --- set the process name of your application below
proc = "gedit"
# ---
focus_hist = focus_history.rootdata
def get(val):
try:
return subprocess.check_output(val).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def front_w():
get_front = str(hex(int(get(["xdotool", "getactivewindow"]))))
return get_front[:2]+(10-len(get_front))*"0"+get_front[2:]
while True:
time.sleep(1)
pid = get(["pgrep", proc])
front1 = ""
while pid:
time.sleep(1)
frontpid = get(["xdotool", "getactivewindow", "getwindowpid"])
front2 = frontpid == pid
if front2 != front1:
if front2 == False:
zdata = [l for l in open(focus_hist).read().splitlines()]
wins = list(reversed([l.split()[0] for l in zdata if not pid in l]))
for w in wins+[front_w()]:
cmd = ["xdotool", "windowraise", w]
subprocess.call(cmd)
pid = get(["pgrep", proc])
front1 = front2
Làm thế nào để thiết lập
Kịch bản sử dụng cả hai wmctrl
vàxdotool
sudo apt-get install wmctrl xdotool
Sao chép tập lệnh 1 vào một tệp trống, lưu nó (chính xác!) Dưới dạng focus_history.py
Sao chép tập lệnh 2 vào một tập tin trống, lưu nó như set_z.py
trong cùng thư mục với tập lệnh 1.
Trong phần đầu của tập lệnh, trong dòng:
proc = "gedit"
thay thế "gedit"
bằng tên quy trình của ứng dụng của bạn (giữa các trích dẫn)
Kiểm tra- chạy tập lệnh: Trước khi mở bất kỳ cửa sổ (bổ sung) nào , hãy khởi động tập lệnh 1 bằng lệnh:
python3 /path/to/focus_history.py & python3 /path/to/set_z.py
[Kịch bản sẽ nhận ra các cửa sổ được tập trung ít nhất một lần. Đó sẽ là trường hợp nếu tập lệnh được chạy khi đăng nhập]
Như đã đề cập, các tập lệnh nên ở trong một và cùng một thư mục, ở cùng cấp độ.
Bây giờ bắt đầu mở các cửa sổ và xem cách nó hoạt động. Ứng dụng của bạn sẽ chuyển sang nền (rất) nếu mất tập trung.
Nếu tất cả đều hoạt động tốt, hãy thêm nó vào Ứng dụng khởi động: Dash> Ứng dụng khởi động> Thêm. Thêm lệnh:
/bin/bash -c "sleep 15 && python3 /path/to/focus_history.py & python3 /path/to/set_z.py"
Ghi chú
- cài đặt giả sử bạn có một single mở cửa sổ của ứng dụng nhắm mục tiêu. Từ câu hỏi của bạn, tôi hiểu đó là trường hợp.
Hoặc
Ngoài ra, bạn có thể đặt phím tắt để nâng cửa sổ của một ứng dụng cụ thể nếu nó tồn tại, như được giải thích ở đây .
Tuy nhiên, điều đó đòi hỏi phải có một lối tắt khác để quay lại cửa sổ của ứng dụng đầu tiên,
Trừ khi...,
Bạn sẽ thiết lập một phím tắt để chuyển đổi giữa hai ứng dụng. Tuy nhiên, điều đó sẽ nằm ngoài phạm vi của câu hỏi này ...