ฉันลองใช้ Ubuntu (Budgie) 20.04 ด้วยผลลัพธ์เดียวกัน ไม่ว่าจะเป็นทางลัด หากใช้งานได้ จะสลับ (เท่านั้น) ระหว่างสองหน้าต่างล่าสุดของแอปพลิเคชันที่ใช้งานอยู่ เช่นเดียวกับคุณกับ a.o. Chrome ไม่มีการสลับเกิดขึ้นเลย
เราสามารถนึกถึงสาเหตุหลายประการที่ทำให้บางแอปพลิเคชันไม่สลับหน้าต่าง แต่เราจำเป็นต้องตรวจสอบโค้ดเพื่อให้ทราบว่าเกิดอะไรขึ้น ถึงอย่างนั้น มันก็ไม่สามารถแก้ไขปัญหาของคุณได้
สคริปต์ด้านล่าง ทำงานเป็น daemon ร่วมกับทางลัดที่แก้ไขแล้ว ทำงานได้ มีการทดสอบบน 20.04 และ (อย่างน้อย) กับ Chrome โดยไม่มีปัญหา ฉันค่อนข้างแน่ใจว่ามันทำงานได้ดีกับทุกแอปพลิเคชันที่มีหน้าต่างประเภท NORMAL
มันทำอะไร
daemon ถูกเรียกใช้โดยไฟล์ทริกเกอร์ ซึ่งสร้างขึ้นใน /tmp
โดย a/ทางลัด จากนั้นจะค้นหาหน้าต่างที่ถูกต้องทั้งหมดของแอปพลิเคชันที่ใช้งานอยู่ ในพื้นที่ทำงานปัจจุบัน ใน ซ้อนกันเราจึงทราบลำดับ z จากนั้น daemon จะเปิดใช้งานหน้าต่างแรกในสแต็ก ซึ่งจะหมุนเวียนผ่านหน้าต่าง
เป็นพิเศษ
...คุณสามารถตั้งค่าทางลัดเพื่อสลับระหว่างหน้าต่างแอปพลิเคชันล่าสุดสองหน้าต่าง ซึ่งเป็นลักษณะการทำงานเริ่มต้นในเวอร์ชัน 20.04 ของฉัน
วิธีการตั้งค่า
- คัดลอกสคริปต์ด้านล่างลงในไฟล์ว่าง บันทึกเป็น
วัฏจักร_ทางเลือก
, (หรือชื่ออื่นที่คุณชอบ). ส่วนขยาย .py
ไม่จำเป็น
- ทำให้สคริปต์ทำงานได้
- เรียกใช้ (ให้มันทำงานต่อไป) โดยคำสั่ง
/path/to/cycle_alternative
.
- ตอนนี้ให้ทางลัดของคุณดำเนินการคำสั่ง
แตะ /tmp/forward_trigger
เพื่อให้วนรอบหน้าต่างทั้งหมดของแอปพลิเคชันที่ใช้งานอยู่ เพื่อสลับไปมาระหว่าง ทั้งสองล่าสุด windows ตั้งค่าทางลัดเพื่อดำเนินการ แตะ /tmp/switchactive_trigger
หากทุกอย่างทำงานได้ดี ให้เพิ่ม daemon ในแอปพลิเคชันเริ่มต้นของคุณ
ทำไมต้องเป็นภูต?
คุณสามารถเพิ่มฟังก์ชันเดียวกันนี้ให้กับสคริปต์ ซึ่งเรียกโดยทางลัด แต่การเริ่มเย็น + การโหลด libs ต่อครั้งจะทำให้การทำงานตอบสนองน้อยลง การเรียกใช้ daemon นั้นไม่มีอะไรเลยเมื่อพูดถึงภาระเพิ่มเติม
สคริปต์/ภูต
#!/usr/bin/env python3
นำเข้า GI
gi.require_version('Wnck', '3.0')
gi.require_version('Gtk', '3.0')
จาก gi.repository นำเข้า Wnck, Gtk, Gio, Gdk, GdkX11
นำเข้าระบบปฏิบัติการ
ระวังชั้นเรียน:
def __init__(ตัวเอง):
self.wnckscr = Wnck.Screen.get_default()
# เราจะเปิดใช้งานฟังก์ชันของ daemon โดยทริกเกอร์ไฟล์
ตัวทริกเกอร์ = [
"/tmp/forward_trigger",
"/tmp/switchactive_trigger"
]
#งั้นเรามาจับตาดูสองไฟล์นี้กัน
forward_mon = Gio.File.new_for_path(self.triggers[0]).monitor(
Gio.FileMonitorFlags.NONE ไม่มี
)
switchactive_mon = Gio.File.new_for_path(self.triggers[1]).monitor(
Gio.FileMonitorFlags.NONE ไม่มี
)
# ...และทำให้พวกเขากระตุ้นบางอย่าง
สำหรับวันจันทร์ใน [
forward_mon, switchactive_mon
]:
mon.connect("เปลี่ยนแปลง", self.switchwindow)
Gtk.main()
def switchwindow (ตัวเอง, arg1, ไฟล์, arg3, เหตุการณ์):
# มาดูกันว่าทริกเกอร์ใดเริ่มทำงาน รับชื่อกลุ่มของหน้าต่างที่ใช้งานอยู่
fname = file.get_path()
activewin = self.wnckscr.get_active_window()
checkwinisnormal = เท็จ
พยายาม:
active_class = activewin.get_class_group_name()
checkwinisnormal = activewin.get_window_type() == Wnck.WindowType.NORMAL
ยกเว้น AttributeError:
ผ่าน
# ตรวจสอบว่ากิจกรรมถูกต้องหรือไม่และหน้าต่างถูกต้องหรือไม่
ฉันตก([
เหตุการณ์ == Gio.FileMonitorEvent.CREATED,
ตรวจวินไม่ปกติ
]):
# เราจะได้หน้าต่างของแอปพลิเคชันที่ใช้งานและพื้นที่ทำงานปัจจุบัน
# มองหาหน้าต่างในพื้นที่ทำงานนี้เท่านั้น
currclass_xids = []
curr_ws = self.wnckscr.get_active_workspace().get_number()
สำหรับ w ใน self.wnckscr.get_windows_stacked():
พยายาม:
บนนี้ = w.get_workspace().get_number() == curr_ws
ยกเว้น AttributeError:
ผ่าน
อื่น:
ฉันตก([
w.get_window_type() == Wnck.WindowType.NORMAL,
active_class == w.get_class_group_name(),
บนนี้
]):
currclass_xids.append(w.get_xid())
target_xid = [0, -2][self.triggers.index(ชื่อ)]
สำหรับ w ใน self.wnckscr.get_windows_stacked():
พยายาม:
ถ้า w.get_xid() == currclass_xids[target_xid]:
ตอนนี้ = GdkX11.x11_get_server_time(
GdkX11.X11Window.lookup_for_display(
Gdk.Display.get_default(),
GdkX11.x11_get_default_root_xwindow()
)
)
w.activate (ตอนนี้)
ยกเว้น IndexError:
ผ่าน
พยายาม:
os.remove (ชื่อ)
ยกเว้น FileNotFoundError:
ผ่าน
ระวัง()
NB
ป.ล. คุณอาจต้องติดตั้ง libs เพิ่มเติมหนึ่งหรือสองตัว แต่ลองมาดูกันว่ามีเอาต์พุตในเทอร์มินัลหรือไม่