Am încercat pe Ubuntu (Budgie) 20.04 cu același rezultat, fie că scurtătura, dacă a funcționat, a comutat (doar) între cele mai recente două ferestre ale aplicației active. Ca tine, cu a.o. Chrome, nu a avut loc nicio comutare.
Ne putem gândi la mai multe motive pentru care anumite aplicații nu schimbă ferestrele, dar ar trebui să ne uităm în cod pentru a ști ce se întâmplă exact. Chiar și atunci, problema dvs. nu ar fi fost rezolvată.
Scriptul de mai jos, rulat ca un demon, în combinație cu o comandă rapidă editată, face totuși treaba. Este testat pe 20.04 și (cel puțin) cu Chrome fără nicio problemă. Sunt destul de sigur că funcționează bine cu toate aplicațiile cu ferestre de tip NORMAL.
Ce face
Daemonul este declanșat de un fișier declanșator, creat în /tmp
printr-o scurtătură. Ulterior, caută toate ferestrele valide ale aplicației active, pe spațiul de lucru curent, în grămadă, deci cunoaștem ordinea z. Daemonul activează apoi prima fereastră din stivă, parcurgând astfel ferestrele.
Ca un plus
...Puteți seta o comandă rapidă pentru a comuta între cele mai recente două ferestre ale aplicației, care a fost comportamentul implicit pe 20.04.
Cum se configurează
- Copiați scriptul de mai jos într-un fișier gol, salvați-l ca
ciclu_alternativ
, (sau orice alt nume care vă place). Extensia .py
nu este necesar.
- Faceți scriptul executabil
- Rulați-l (păstrați-l să ruleze) prin comandă
/path/to/cycle_alternative
.
- Acum faceți comanda rapidă să execute comanda
atingeți /tmp/forward_trigger
pentru a-l face să circule prin toate ferestrele aplicației active. Pentru a comuta între cele mai recente două Windows, setați comanda rapidă să se execute atingeți /tmp/switchactive_trigger
Dacă totul funcționează bine, adăugați demonul la aplicațiile dvs. de pornire.
De ce un demon?
Ați putea adăuga aceeași funcționalitate unui script, apelat printr-o comandă rapidă, dar pornirea la rece + încărcarea bibliotecilor pe ocazie l-ar face să funcționeze mai puțin receptiv. Rularea demonului nu este nimic atunci când vine vorba de o povară suplimentară.
Scriptul/daemonul
#!/usr/bin/env python3
import gi
gi.require_version('Wnck', '3.0')
gi.require_version('Gtk', '3.0')
din gi.repository import Wnck, Gtk, Gio, Gdk, GdkX11
import os
atentie la clasa:
def __init__(self):
self.wnckscr = Wnck.Screen.get_default()
# vom activa funcția demonului prin fișierele de declanșare
self.triggers = [
„/tmp/forward_trigger”,
„/tmp/switchactive_trigger”
]
# deci, să fim cu ochii pe aceste două fișiere
forward_mon = Gio.File.new_for_path(self.triggers[0]).monitor(
Gio.FileMonitorFlags.NONE , Nici unul
)
switchactive_mon = Gio.File.new_for_path(self.triggers[1]).monitor(
Gio.FileMonitorFlags.NONE , Nici unul
)
# ...și fă-i să declanșeze ceva
pentru luni în [
forward_mon, switchactive_mon
]:
mon.connect(„schimbat”, self.switchwindow)
Gtk.main()
def switchwindow(self, arg1, file, arg3, event):
# să vedem ce declanșator este declanșat, obțineți numele grupului ferestrei active
fname = file.get_path()
activewin = self.wnckscr.get_active_window()
checkwinisnormal = Fals
încerca:
active_class = activewin.get_class_group_name()
checkwinisnormal = activewin.get_window_type() == Wnck.WindowType.NORMAL
cu excepția AttributeError:
trece
# să verificăm dacă evenimentul este corect și dacă fereastra este validă
eu cad([
eveniment == Gio.FileMonitorEvent.CREATED,
checkwin este normal
]):
# vom obține ferestrele aplicației active și spațiul de lucru curent
# căutați ferestre numai în acest spațiu de lucru
currclass_xids = []
curr_ws = self.wnckscr.get_active_workspace().get_number()
pentru w în self.wnckscr.get_windows_stacked():
încerca:
onthis = w.get_workspace().get_number() == curr_ws
cu excepția AttributeError:
trece
altceva:
eu cad([
w.get_window_type() == Wnck.WindowType.NORMAL,
active_class == w.get_class_group_name(),
pe aceasta
]):
currclass_xids.append(w.get_xid())
target_xid = [0, -2][self.triggers.index(fname)]
pentru w în self.wnckscr.get_windows_stacked():
încerca:
dacă w.get_xid() == currclass_xids[target_xid]:
acum = GdkX11.x11_get_server_time(
GdkX11.X11Window.lookup_for_display(
Gdk.Display.get_default(),
GdkX11.x11_get_default_root_xwindow()
)
)
w.activate(acum)
cu excepția IndexError:
trece
încerca:
os.remove(fname)
cu excepția FileNotFoundError:
trece
ai grija()
N.B.
P.S. Posibil, ar putea fi necesar să instalați una sau două biblioteci suplimentare, dar să aflăm dacă există vreo ieșire în terminal.