Puncte:2

comutarea între ferestrele aceleiași aplicații nu funcționează întotdeauna

drapel gb

Când comut între ferestrele aceleiași aplicații, nu funcționează toate aplicatii:

  • terminal gnome: OK
  • gedit: OK
  • crom: KO
  • emacs: KO

Mai precis, pentru Chrome și emacs vede doar o fereastră în timp ce două sunt deschise.

În același timp, funcția de grupare a ferestrelor funcționează foarte bine în bara de jos care arată toate ferestrele deschise.

În „preferințe” -> „Comenzi rapide de la tastatură”, am personalizat „Switch windows of an application” cu „Super+Tab” și am dezactivat „Switch Applications”.

Text

Este aceasta o problemă cunoscută?

Sunt pe Ubuntu 20.04 care rulează Gnome 3.36.8 flashback (metacity).

Mulțumiri!

drapel ru
Comentariile nu sunt pentru discuții extinse; această conversație a fost [mutată în chat](https://chat.stackexchange.com/rooms/129129/discussion-on-question-by-ricky-robinson-switching-between-windows-of-the-same-a) .
Puncte:1
drapel by

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.

drapel gb
Mulțumesc mult pentru scenariu! Pare un pic exagerat, totuși. :) Cu siguranță meriți recompensă, lasă-mă să-mi dau seama dacă pot remedia acest lucru actualizând configurația.
Jacob Vlijm avatar
drapel by
@RickyRobinson vrei să spui exagerat pentru a face un script pentru el sau exagerat pentru a -utiliza- un script pentru el? Dacă primul: nu vă faceți griji, este o versiune python editată/simplificată a unei extrageri de cod pe care o folosesc în altă parte. Utilizarea acestuia nu este chiar complicată și rezolvă problema. O altă opțiune este, desigur, actualizarea la o versiune ulterioară a Ubuntu, unde pare a fi remediată (cel puțin în versiunea dev. 21.10). Este mult mai multă muncă totuși :)
Puncte:0
drapel cn

Încercați să suprascrieți valorile.

  1. Configurați o nouă valoare pentru Schimbați aplicațiile.
  2. Suprascrieți valoarea pentru Schimbați ferestrele.
drapel gb
Văd. Dar pe o altă mașină, am debian + xfce și comutarea între ferestrele aceleiași aplicații funcționează foarte bine. Cel puțin în acea configurație, nu pare să existe diferențe de comportament de la o aplicație la alta.
Unix avatar
drapel cn
Ah, omule, „citeam” (greșit) „file” în loc de „windows”... Lasă-mă să-mi repar răspunsul.
drapel gb
Sigur! Dar... „comutați aplicațiile” se reduce la „schimbați ferestrele” în configurația mea. Se pare că fac exact același lucru în ambele spații de lucru ale mele. Problema mea este că comutarea între ferestrele aceleiași aplicații este greșită...
Unix avatar
drapel cn
Dacă suprascrierea valorilor (doar pentru a le testa) nu rezolvă problema, atunci următorul pas este să verificați instrumentul dconf. Aruncă o privire la acest răspuns: https://superuser.com/a/860001/396041
drapel gb
Bine, dar asta nu a dus nicăieri, din păcate. Problema nu este că nu funcționează niciodată. Problema este că pentru unele aplicații funcționează, dar pentru altele vede o singură fereastră, în timp ce sunt multe.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.