Contesto essenziale #
Looking Glass è la console di debug integrata in GNOME Shell: una REPL JavaScript che gira dentro il processo della shell, affiancata da un ispettore di finestre, estensioni e attori grafici.
Serve a rispondere a domande come “qual è la wm_class di questa finestra?”, “questa applicazione gira nativa su Wayland o passa da XWayland?”, “quale estensione sta generando errori?”.
Non richiede installazione ed è disponibile anche in sessione Wayland. I contenuti di questo post sono verificati su GNOME Shell 50.
Prerequisiti #
- Una sessione GNOME Shell
- Gli strumenti di sviluppo abilitati (lo sono di default)
Verifica rapida:
gsettings get org.gnome.shell development-toolsOutput atteso: true. Se restituisce false:
gsettings set org.gnome.shell development-tools trueProcedura passo-passo #
1. Aprire Looking Glass #
- Premere Alt+F2 per aprire la finestra “Esegui un comando”
- Digitare
lg - Premere Invio
Il pannello scende da sotto la barra superiore e occupa circa il 70% dello schermo principale.
2. Chiuderlo #
Premere Esc.
Looking Glass è modale: finché è aperto, tastiera e mouse non raggiungono le finestre sottostanti.
3. Orientarsi nell’interfaccia #
In alto a sinistra ci sono due pulsanti:
- Mirino: avvia il picker per selezionare un elemento dell’interfaccia con il mouse
- Cestino: forza un ciclo di garbage collection
In alto a destra le schede:
| Scheda | Contenuto |
|---|---|
Evaluator |
REPL JavaScript eseguita nel contesto della shell |
Windows |
Finestre aperte con titolo, wmclass e applicazione associata |
Extensions |
Estensioni installate, stato ed errori |
Actors |
Albero degli attori Clutter che compongono l’interfaccia |
Flags |
Interruttori di debug di Clutter e Mutter |
Per passare da una scheda all’altra: Ctrl+Pag↑ e Ctrl+Pag↓.
4. Usare l’Evaluator #
Scrivere un’espressione JavaScript al prompt >>> e premere Invio. Il risultato viene numerato e resta nello storico.
Sono già disponibili senza import:
Clutter,Gio,GLib,GObject,Meta,Shell,StMain: il modulo principale della shellglobal: l’oggetto globale della shellstage: scorciatoia perglobal.stage
Funzioni e variabili specifiche di Looking Glass:
| Nome | Significato |
|---|---|
it |
Risultato dell’ultimo comando |
r(<n>) |
Risultato numero <n> dello storico |
inspect(<x>, <y>) |
Attore presente alle coordinate indicate |
Tasti utili:
- Tab: completamento automatico
- Tab due volte: elenco dei completamenti possibili
- Freccia su / giù: cronologia dei comandi (persistente tra una sessione e l’altra)
I risultati di tipo oggetto sono cliccabili: aprono un ispettore con tutte le proprietà, navigabile con Back e richiamabile nell’Evaluator con Insert.
5. Selezionare un elemento con il picker #
- Cliccare sul mirino
- Muovere il mouse: l’attore sotto il puntatore viene evidenziato con un bordo rosso
- Rotella su per salire all’attore genitore, rotella giù per ridiscendere
- Click per confermare, Esc per annullare
L’attore scelto finisce nell’Evaluator come risultato inspect(<x>, <y>) ed è subito utilizzabile tramite it.
Esempi pratici #
Tutti i comandi seguenti vanno digitati nell’Evaluator.
Classe della finestra che aveva il focus prima di aprire Looking Glass:
global.display.focus_window.get_wm_class()La finestra è un client Wayland nativo? (false significa XWayland):
global.display.focus_window.get_client_type() === Meta.WindowClientType.WAYLANDTitolo e classe di tutte le finestre aperte:
global.get_window_actors().map(a => `${a.metaWindow.get_wm_class()} | ${a.metaWindow.get_title()}`)PID del processo proprietario della finestra:
global.display.focus_window.get_pid()Posizione e dimensioni della finestra:
global.display.focus_window.get_frame_rect()Numero di monitor e di spazi di lavoro:
global.display.get_n_monitors()
global.workspace_manager.get_n_workspaces()UUID delle estensioni installate:
Main.extensionManager.getUuids()Oggetto completo di una singola estensione (stato, percorso, metadati):
Main.extensionManager.lookup('<uuid>')Indicatori presenti nella barra superiore:
Object.keys(Main.panel.statusArea)Inviare una notifica di prova:
Main.notify('Looking Glass', 'Notifica di test')Rallentare tutte le animazioni della shell di 5 volte, utile per osservare una transizione:
St.Settings.get().slow_down_factor = 5Ripristino:
St.Settings.get().slow_down_factor = 1Errori comuni #
-
Alt+F2 non apre nulla Controllare che la scorciatoia non sia stata cambiata con
gsettings get org.gnome.desktop.wm.keybindings panel-run-dialoge che la riga di comando non sia bloccata:gsettings get org.gnome.desktop.lockdown disable-command-linedeve restituirefalse -
lgviene trattato come un programma inesistente I comandi interni di Alt+F2 sono disattivati: succede sedevelopment-toolsèfalseoppure se sull’account sono attivi i controlli parentali -
Una variabile dichiarata con
constoletnon esiste più al comando successivo Ogni riga viene eseguita in una funzione separata. Riutilizzare i risultati coniter(<n>), oppure salvare il valore suglobalThis.<nome> -
Il risultato è
<exception ...>L’espressione ha sollevato un errore, mostrato nel testo dell’eccezione. Caso tipico:global.display.focus_windowènullperché nessuna finestra aveva il focus -
Non si riesce a copiare testo da una finestra mentre Looking Glass è aperto È il comportamento previsto dalla modalità modale: chiudere con Esc, copiare, riaprire. La cronologia dei comandi viene mantenuta
Note operative #
- Il codice dell’Evaluator gira nel processo di GNOME Shell. Su Wayland la shell è anche il compositor: un’istruzione che la blocca o la manda in crash chiude l’intera sessione e le applicazioni aperte
- Su Wayland non esiste il riavvio a caldo della shell: il comando
rdi Alt+F2 non è tra i comandi interni di GNOME Shell 50. Gli altri disponibili sonort(ricarica il tema) edebugexit(termina la shell, quindi la sessione) - La scheda
Extensionsoffre per ogni estensioneView Source,Web PageeShow Errors: è il punto più rapido per capire perché un’estensione risulta in statoError - La scheda
Flagsagisce a caldo sul compositor.unsafe-moderimuove le restrizioni sulle API D-Bus riservate della shell: va disattivato a fine test - L’output di
log()econsole.log()non compare in Looking Glass ma nel journal:
journalctl -f -o cat /usr/bin/gnome-shell- Per sviluppare o provare un’estensione senza rischiare la sessione di lavoro conviene una shell annidata. Da GNOME 49:
dbus-run-session gnome-shell --devkit --waylandRichiede il pacchetto mutter-devkit, non sempre installato di default. Fino a GNOME 48 l’equivalente era dbus-run-session gnome-shell --nested --wayland.