Tôi đã thử trên Ubuntu (Budgie) 20.04 với kết quả tương tự, có thể là phím tắt, nếu hoạt động, sẽ chuyển (chỉ) giữa hai cửa sổ gần đây nhất của ứng dụng đang hoạt động. Giống như bạn, với a.o. Chrome, không có chuyển đổi nào diễn ra.
Chúng ta có thể nghĩ ra một số lý do tại sao các ứng dụng cụ thể không chuyển cửa sổ, nhưng chúng ta cần xem xét mã để biết chính xác điều gì đang xảy ra. Thậm chí sau đó, nó sẽ không khắc phục được vấn đề của bạn.
Tuy nhiên, tập lệnh bên dưới, chạy dưới dạng trình nền, kết hợp với lối tắt đã chỉnh sửa, sẽ thực hiện công việc. Nó đã được thử nghiệm vào ngày 20.04 và (ít nhất) với Chrome mà không gặp vấn đề gì. Tôi khá chắc chắn rằng nó hoạt động tốt với tất cả các ứng dụng có cửa sổ loại BÌNH THƯỜNG.
Những gì nó làm
Trình nền được kích hoạt bởi một tệp kích hoạt, được tạo trong /tmp
bằng một/phím tắt. Sau đó, nó tra cứu tất cả các cửa sổ hợp lệ của ứng dụng đang hoạt động, trên không gian làm việc hiện tại, trong cây rơm, vì vậy chúng tôi biết thứ tự z. Trình nền sau đó kích hoạt cửa sổ đầu tiên trong ngăn xếp, do đó quay vòng qua các cửa sổ.
Như một phụ
...Bạn có thể đặt phím tắt để chuyển đổi giữa hai cửa sổ ứng dụng gần đây nhất, đây là hành vi mặc định trên 20.04 của tôi.
Làm thế nào để thiết lập
- Sao chép tập lệnh bên dưới vào một tệp trống, lưu nó dưới dạng
chu kỳ_thay thế
, (hoặc bất kỳ tên nào khác mà bạn thích). Phần mở rộng .py
là không cần thiết.
- Làm cho tập lệnh có thể thực thi được
- Chạy nó (giữ cho nó chạy) bằng lệnh
/path/to/cycle_alternative
.
- Bây giờ làm cho phím tắt của bạn thực hiện lệnh
chạm /tmp/forward_trigger
để làm cho nó quay vòng qua tất cả các cửa sổ của ứng dụng đang hoạt động. Để chuyển đổi giữa hai cái gần đây nhất cửa sổ, đặt phím tắt để thực thi chạm /tmp/switchactive_trigger
Nếu tất cả đều hoạt động tốt, hãy thêm daemon vào các ứng dụng khởi động của bạn.
Tại sao lại là daemon?
Bạn có thể thêm chức năng tương tự vào tập lệnh, được gọi bằng phím tắt, nhưng khởi động nguội + tải lib mỗi lần sẽ khiến tập lệnh hoạt động kém phản hồi hơn. Chạy trình nền không là gì khi có thêm gánh nặng.
Tập lệnh/daemon
#!/usr/bin/env python3
nhập gi
gi.require_version('Wnck', '3.0')
gi.require_version('Gtk', '3.0')
từ gi.repository nhập Wnck, Gtk, Gio, Gdk, GdkX11
nhập hệ điều hành
lớp coi chừng:
def __init__(bản thân):
self.wnckscr = Wnck.Screen.get_default()
# chúng tôi sẽ kích hoạt chức năng của daemon bằng các tệp kích hoạt
self.triggers = [
"/tmp/forward_trigger",
"/tmp/switchactive_trigger"
]
# vì vậy, hãy để mắt đến hai tệp này
forward_mon = Gio.File.new_for_path(self.triggers[0]).monitor(
Gio.FileMonitorFlags.NONE , Không có
)
switchactive_mon = Gio.File.new_for_path(self.triggers[1]).monitor(
Gio.FileMonitorFlags.NONE , Không có
)
# ...và khiến chúng kích hoạt thứ gì đó
cho mon trong [
forward_mon, switchactive_mon
]:
mon.connect("đã thay đổi", self.switchwindow)
Gtk.main()
def switchwindow(self, arg1, file, arg3, event):
# hãy xem trình kích hoạt nào được kích hoạt, lấy tên nhóm của cửa sổ đang hoạt động
fname = file.get_path()
activewin = self.wnckscr.get_active_window()
checkwinisnormal = Sai
cố gắng:
active_class = activewin.get_class_group_name()
checkwinisnormal = activewin.get_window_type() == Wnck.WindowType.NORMAL
ngoại trừ Thuộc tínhError:
vượt qua
# hãy kiểm tra xem sự kiện có đúng không và cửa sổ có hợp lệ không
tôi ngã([
sự kiện == Gio.FileMonitorEvent.CREATED,
checkwinisnormal
]):
# chúng ta sẽ nhận được các cửa sổ của ứng dụng đang hoạt động và không gian làm việc hiện tại
# chỉ tìm cửa sổ trên không gian làm việc này
Currclass_xids = []
curr_ws = self.wnckscr.get_active_workspace().get_number()
cho w trong self.wnckscr.get_windows_stacked():
cố gắng:
onthis = w.get_workspace().get_number() == curr_ws
ngoại trừ Thuộc tínhError:
vượt qua
khác:
tôi ngã([
w.get_window_type() == Wnck.WindowType.NORMAL,
active_class == w.get_class_group_name(),
trên này
]):
currclass_xids.append(w.get_xid())
target_xid = [0, -2][self.triggers.index(fname)]
cho w trong self.wnckscr.get_windows_stacked():
cố gắng:
nếu w.get_xid() == currclass_xids[target_xid]:
bây giờ = GdkX11.x11_get_server_time(
GdkX11.X11Window.lookup_for_display(
Gdk.Display.get_default(),
GdkX11.x11_get_default_root_xwindow()
)
)
w.kích hoạt (bây giờ)
ngoại trừ IndexError:
vượt qua
cố gắng:
os.remove(fname)
ngoại trừ FileNotFoundError:
vượt qua
coi chừng()
NB
Tái bút Có thể, bạn có thể cần cài đặt một hoặc hai lib bổ sung, nhưng hãy tìm hiểu xem có bất kỳ đầu ra nào trong thiết bị đầu cuối không.