Tecnologia e non solo

luglio 17, 2007

Fusion: finestra.. chi sei? Nome? Classe? Stato?

Filed under: CompComm,Fusion,OpenCompositing — telperion @ 3:31 pm

Tratto da Tip of the Week (Thanks to Jupiter for this)

In opacita, regole finestre, animazioni, widget e altri plugin
è spesso necessario inserire tipo o classe o altro identificatore
delle finestre che vogliamo includere o escludere delle nostre operazioni,
il tutto condito da una sintassi logica (booleana)
per operare selezioni mirate.

Facciamo un pò di chiarezza e qualche esempio.

I nomi sono sensibili al maiuscolo quindi:

no Menu ma menu

Se volete invertire la selezione mettete un ! (punto esclamativo prima) es.

!type=desktop

selezionerà tutte le finestre che non hanno come type desktop.

Potete concatenare diverse espressioni con gli operatori logici

| = OR
& = AND

Cosi potete scrivere:

type=desktop | type=dock

che significa desktop oppure (OR) dock

Potete raggruppare espressioni usando le parentesi.

Le finestre si possono individuare tramite 4 attributi principali:

type – type della finestra

state – individua la finestra in base allo stato,
stato che puo essere: modal, sticky, maxvert, maxhorz, shaded, skiptaskbar, skippager, hidden, fullscreen, above, below, demandsattention

xid – seleziona l’ id della finestra (poco utile perchè l’id esiste solo dopo la creazione della medesima)

override_redirect – mettelo a 1 per individuare override_redirect windows. Puo essere usato per selezionare i menù di firefox poichè corrispondono a

(type=Normal & override_redirect=1)

Il plugin regex se attivato fornisce ulteriori attributi di riconoscimento:

title – il titolo della finestra
role – il ruolo della finestra
class – la classe della finestra
name – il nome della finestra

Potete trovare gli attributi “name, class, role, title, eccetera” di una finestra
digitando in un terminale i comandi illustrati sotto
e poi cliccando sull’oggetto che state cercando di definire.

type (window type)
xprop | grep WINDOW_TYPE | cut -d _ -f 10

class (window class)
xprop | grep WM_CLASS | cut -d \" -f 4

name (class name)
xprop | grep WM_CLASS | cut -d \" -f 2

title (window title)
xprop | grep "WM_NAME(STRING)" | cut -d \" -f 2

program (owning program)
ps -o comm= -p $(xprop | grep "_NET_WM_PID(CARDINAL)" | sed 's/.*= //g')

role (class role)
xprop | grep "WM_WINDOW_ROLE(STRING)" | cut -d \" -f 2

Con questi valori potete creare espressioni.

Esempi:

(Toolbar | Menu | Utility | Dialog | Normal | Unknown) & !title=.*Firefox

(Toolbar | Menu | Utility | Dialog | Normal | Unknown) & !class=Firefox-bin

Esempio terra-terra del sottoscritto:

tutte le finestre hanno in chiusura l’effetto Animazioni close animation Glide1.
La stringa nel configuratore è:

Glide1 0,2000 (type=Normal)

type ho solo normal perchè ho disattivato l’effetto su qualsiasi altro tipo di finestre.
Ora l’obbiettivo è fare in modo che Firefox si chiuda con l’effetto Brucia.

Apriamo firefox.

da terminale
xprop | grep WM_CLASS | cut -d \" -f 4
clicchiamo la fiestra di Firefox e otteniamo
Firefox-bin che è la class poi
xprop | grep WM_CLASS | cut -d \" -f 2
ci darà come risultato
gecko che è il name.

Il tipo di finestra è
xprop | grep WINDOW_TYPE | cut -d _ -f 10
NORMAL

Ora abbiamo tutto quel che ci serve.
Intanto
Glide1 200 (type=Normal)
dobbiamo escludere le finestre Firefox da Glide1
le finestre di firefox le riconosciamo se sono Firefox-bin e (&) geko cioè in booleano:
(class=Firefox-bin & name=gecko)
quindi
Glide1 200 (type=Normal) & !(class=Firefox-bin & name=gecko)
farà in modo che Glide1 sarà applicato alle finestre normali e (&) diverse (!) da firefox.

Ora aggiungiamo una animazione Brucia durata 0,5 (500)
ed in finestre corrispondenti:
(type=Normal) & (class=Firefox-bin & name=gecko)
tipo = normale e (&) firefox
risultato:

Brucia 500 (type=Normal) & (class=Firefox-bin & name=gecko)
E vedrete che le finestre di firefox, e solo quelle in chiusura
andranno a fuoco.

Ovviamente la potenzialità del sistema è enorme.
Questo è solo un banale esempio per fornirvi lo spunto,
a voi le miriadi di applicazioni pratiche.

Altro esempio: plugin trailfocus e Gimp.

Il plugin trailfocus rende un po trasparenti le finestre non in focus,
quando riacquistano il focus tornano opache, questo migliora la concetrazione.

Il problema che Gimp ha 3 finestre e solitamente cliccando l’immagine
questa ritorna opaca, mentre le due finestre dei tool rimangono trasparenti.

Il tipo di finestre default trattate da Trailfocus è:

(type=toolbar | type=utility | type=dialog | type=normal) & !(state=skiptaskbar | state=skippager)

tradotto: finestre toolbar oppure (|) utility o dialog o normali e (&) non (!) in stato skiptaskbar o skippager

Ora individuato con gli strumenti a disposizione
che le 2 finestre di Gimp hanno

role=gimp-toolbox

e

role=gimp-dock

basta aggiunger anche queste 2 opzioni nelle oppure (|) di non (!)

Tradotto in booleano:

(type=toolbar | type=utility | type=dialog | type=normal) & !(state=skiptaskbar | state=skippager | role=gimp-toolbox | role=gimp-dock)

Ora le 2 finestre tool di gimp non verranno più “trasparentizzate” da trailfocus.

Altri esempi del post originale (in inglese) riferiti al plugin window rules:

Here’s a few use cases that you can try out today if you just pull the
latest bits from the master branch.

1. Simple window matching for a specific action. I’ve added a
focus_prevention_match option which allow you to specify which windows
focus prevention should apply to. E.g. when having the regex plugin
loaded you can set the option to something like this:

"(!class=Gecko | title=*Pref*) & !class=.*terminal.*"

2. Keep a consistent state which depend on some window properties. The
blur plugin now include an option which allow you to specify for which
windows destination blur should be automatically enabled when no window
property is set. If you set that option to:

"title=.*terminal.*"

the plugin will need to know when the title changes to something that
might make that match no longer true or the other way around. The
matchWindowPropertyChanged function exists for that purpose and by
wrapping that function you’ll know when some window property that might
affect the window matching you’re doing have changed and you can then
re-valuate the matching for that window.

3. Can be use to dynamically specific which windows an action should
apply to. I’ve updated the initiate actions in the scale plugin so it’s
possible to provide a match option as argument to any one of them. This
means that an external source can initiate scale mode for a specific set
of windows. E.g. by using the dbus plugin you can do this

dbus-send –type=method_call –dest=org.freedesktop.compiz /org/freedesktop/compiz/scale/allscreens/initiate org.freedesktop.compiz.activate string:'root' int32:`xwininfo -root | grep id: | awk '{ print $4 }'` string:'match' string:'class=Gnome-terminal'

to initiate scale mode only for gnome-terminal windows. You can use
something like
"string:'xid=0xc1cd78 | xid=0xc200a0 | xid=0xc2100b'"
instead if you want to specify the exact windows.”

Thanks to Jupiter for that

Altri articoli su Fusion

11 commenti

  1. ok ok
    se questa è la linea che fusion vuole imporre torno di corsa a compiz 0.3.4
    trovo che sia una grossa str……., quel configuratore sta diventando una cosa oscena che nessuno puo’ comprendere … lo devono fare FUNZIONALE e SEMPLICE, questa è roba da NERD. Nessuno discute che sia una gran figata e configurabile a volontà anche nei minimi dettagli, ma oltre agli smanettoni chi cia’ voglia di settare in questo modo ASTRUSO tutta sta roba ?
    Trovo che sia sbagliato e inutile, scrivere un software cosi’ complicato che solo chi c’ia voglia di studiarsi una montagna di parametri puo’ configurare.
    e un gestore del desktop, non è autocad ! deve semplificarmi la vita, non complicarmela😐
    cmq, ancora una volta, ottimo telperion che si e “sbattuto” a scrivere qualcosa di diverso su fusion, invece dei soliti 4 comandi di tutti i blog. compliments again !😉

    Commento di LuNa — luglio 17, 2007 @ 4:33 pm

  2. […] di un ingegnere termonucleare che conosce i nomi del tipo di ogni finestra che infesta il desktop da inserire a mano con sintassi booleana, mah! (Vero che in questo modo si possono abbinare effetti diversi per ogni tipo di finestra, ma […]

    Pingback di Fusion: avviso per i naviganti. « Tecnologia e non solo — luglio 17, 2007 @ 6:29 pm

  3. Mah, sarà ma io finalmente inizio ad apprezzarlo, perché finalmente posso dirgli puntualmente cosa voglio e come deve essere. Al limite potrebbero integrare un pulsante “Detect” alla KDE “Window-Specific Settings” e un sistema di menu per comporre in maniera trasparente le regole per le animazioni (ma vale anche per i plugin Place e Window Rules), lasciando però agli smanettoni la possibilità di smanettare.

    Alla fine son passato a linux (5 anni or sono) e vi sono rimasto proprio perché quando e se voglio posso sempre andare a sporcarmi le mani senza fare troppa fatica. Se non voglio fare fatica uso il pannello di controllo o configuratore di turno.

    Ah, giusto. Grazie molte per l’ottima guida. In attesa di qualcosa del genere avevo appreso un paio di regole spulciando i sorgenti (che non fa mai male, ma non è proprio il massimo della praticità).

    Grazie ancora.

    Commento di Io — luglio 17, 2007 @ 6:55 pm

  4. @Io: corretto anche il tuo punto di vista, ci avevo pensato, in effetti. Dovrebbero prendere la strada intermedia e fare il CCSM cosi come lo conosciamo (gonfio di opzioni e casini di ogni tipo) e un “pannello” stile pronti ai posti via.

    Commento di LuNa — luglio 17, 2007 @ 7:39 pm

  5. ottimo post, puntuale e chiaro. Complimenti!!

    Commento di dav2dev — luglio 18, 2007 @ 12:41 am

  6. Stavo rileggendo il titolo.
    Non era meglio
    “Chi siete? Quanti siete? Da dove venite? Dove andate? Cosa portate? Un Fiorino!”😀

    Commento di Io — luglio 18, 2007 @ 8:57 am

  7. […] (ancora un’ovazione ;P ) in questo articolo (tratto a suo valta da Jupiter) fa un po’ di chiarezza sui comandi da usare come […]

    Pingback di Fusion settings « Opera Omnia — luglio 18, 2007 @ 9:14 am

  8. @6
    era 5 fiorini!!😛

    Commento di Cisco — luglio 18, 2007 @ 2:21 pm

  9. Un fiorino!

    Commento di telperion — luglio 18, 2007 @ 4:08 pm

  10. […] Fusion: finestra.. chi sei? Nome? Classe? Stato? […]

    Pingback di Fusion: ccsm e Gnome tooltip. « Tecnologia e non solo — agosto 21, 2007 @ 9:05 pm

  11. Ciao, sto impazzendo perchè non riesco a far “capire” a compiz quando una finestra è maximized…
    Ho provarto con:

    !(state=.*max.*)
    !(state=maxvert)
    !(state=maxhorz)
    !(state=maxvert | state=maxhorz)

    per far sì che le finestre massimizzate non abbiano l’ombra ma non funziona….😦
    Help!!

    Commento di Viggio — aprile 1, 2008 @ 11:47 am


RSS feed for comments on this post.

Crea un sito o un blog gratuitamente presso WordPress.com.

%d blogger cliccano Mi Piace per questo: