
Mange GNOME brugere har sikkert irriteret sig over den noget begrænsede kontrol med vinduer, som window manageren tilbyder. Det er der nogen, der har gjort noget ved, og resultatet er Devil's Pie (http://www.burtonini.com/blog/computers/devilspie).
Programmet Devil's Pie giver kort sagt fuld kontrol over vinduer i GNOME. Vil man, at Firefox, hver gang det startes, skal starte på desktop nr 2 i størrelsen 800x600 pixels og centreret på skærmen, så kan man det. Vil man, at alle Gaim-samtalevinduer skal dukke op på alle desktops og ikke tage plads i taskbaren, så er det også muligt.
Devil's Pie benytter sig af små scripts, der definerer behandlingen af et bestemt vindue. Disse scripts benytter s-expressions, der i begyndelsen kan være lidt kryptiske, men man lærer hurtigt sammenhængen. Devil's Pie leder efter scripts i mappen .devilspie i brugerens hjemmemappe, og scripts har endelsen .ds. Desuden kan man kun lave et script pr. fil, men med lidt snilde kan man nemt få et script til at gøre flere ting. En logisk fremgangsmåde er at lave en fil pr. applikation, man ønsker at styre.
Lad os se på et par eksempler, for at komme i gang med programmet. Lad os antage, at vi altid ønsker at have Evolution og Gaim på desktop 1. Siden vi er dovne, vil vi gerne have begge programmer til at placere sig på et bestemt sted på skærmen og med en bestemt størrelse, så vi slipper for at flytte på vinduerne bagefter. Desuden vil vi gerne have Gaim til ikke at optage plads i taskbaren samt altid være øverst.
Først skal man selv oprette mappen til sine scripts og skifte til denne mappe:
[code]
mkdir .devilspie
cd .devilspie
[/code]
Dernæst starter man sin yndlingseditor og laver en fil ved navn evolution.ds:
[code]
vim evolution.ds
[/code]
Her tamper vi følgende script ind - forklaring følger:
[code]
(if
(is (application_name) "evolution-2.6")
(begin
(set_workspace 1)
(geometry "930x800+15+50")
)
)
[/code]
Det ser sikkert frygtelig kompliceret ud for nogen og vanvittigt enkelt ud for andre. Vi tager det linje for linje:
De to første linjer er ret logiske. Formålet med scriptet er jo, at Evolution-vinduet skal gøre noget bestemt. Derfor må vi have en conditional sætning, der siger "hvis applikationens navn er "evolution-2.6", gør dette". Det er linjen (is (application_name) "evolution-2.6") der er interessant her. Den laver en 100% match på strengen mod applikationsnavnet, som det er i processen - dvs det navn, som dukker op, hvis man bruger programmer som ps eller top til at se kørende processer. Istedet for "is" kunne man have brugt "matches" for at lave en delvis match.
Nuvel, vi har identificeret vores program. Hvad skal vi gøre ved det? Jo, eftersom vi har besluttet os at gøre to ting ved det (flytte det til en bestemt placering samt give det en bestemt størrelse), så åbner vi en "begin". Denne indikerer, at nu kommer der en række kommandoer. Disse to er igen ret logiske. Den første, "set_workspace 1" betyder - godt gættet - at programmet skal hoppe til det første desktop. Det betyder, at har man desktop 3 på skærmen og starter Evolution, så vil programmet springe hen på desktop 1, når det er åbnet. Den anden kommando er lidt mere kryptisk, men nogle vil sikkert genkende, at det er en ganske almindelig geometry-string, som man kender fra andre former for vindueshåndtering. Syntaksen for denne er bredde gange højde plus start-x-pixels plus start-y-pixels". Det sidste kan muligvis være lidt svært at forstå, men det betyder, at øverste venstre hjørne skal være x antal pixels fra venstre kant af skærmen og y antal pixels fra toppen af skærmen.
Tilbage er kun at lukke parenteserne igen og teste om det virker. Devil's Pie behøver ikke at være startet, før man starter fx Evolution. Det parser .ds filerne, og er et program allerede åbent, bliver reglerne kørt på det. I begyndelsen prøver vi med -d switchen (debug) for at se, om alting kører som det skal:
[code]
devilspie -d
[/code]
Hvis ikke evolution allerede kører, så start den nu, og se hvordan vinduet gør, som du befaler. Stop Devil's Pie igen med ctrl+c og lav lidt om i værdierne i .ds filen og start programmet igen. Prøv dig lidt frem og bliv fortrolig med, hvad programmet egentlig gør.
Vi gider ikke være så grundige med Gaim-scriptet, for det er i bund og grund det samme. Vi er jo dovne, husker du nok.
[code]
(if
(and
(is (application_name) "gaim")
(is (window_name) "Buddy List")
)
(begin
(geometry "300x800+975+50")
(set_workspace 1)
(skip_tasklist)
(above)
)
)
[/code]
Her er dog et par ting at være opmærksom på:
For det første har vi to regler til at identificere processen, nemlig at application_name skal være "gaim" og window_name skal være "Buddy List". Pakket sammen i en "and" fungerer det sådan, at begge forudsætninger skal være opfyldt. Grunden til, at vi har to regler her, er, at hvis vi kun tjekker på application_name, vil også chat-vinduer rammes af reglerne, og så kommer det til at virke dumt. Hvis vi derimod sikrer os, at vinduets navn samtidig skal være "Buddy List", så gælder det kune selve kontaktlisten.
Her er det også værd at bide mærke i de to kommandoer "skip_tasklist" og "above". Den første fjerner Gaim (og kun kontaktlisten, husker vi) fra taskbaren. Dette er meget smart, hvis man bruger et ikon i notification area. Den anden kommando sikrer, at Gaim-vinduet altid er øverst. Det er sikkert en smagssag, men jeg synes det er meget behageligt.
Devil's Pie kan meget mere end hvad jeg har skrevet her, så se mere på http://live.gnome.org/DevilsPie og på http://wiki.foosel.net/linux/DevilsPie. Specielt den sidste har en meget grundig gennemgang af kommandoerne.
God fornøjelse med djævelens tærte!
Om forfatteren:
Har været linuxbruger med svingende succes siden 1997, hvor det i starten mest var installation af små servere for sjov. Siden har det udviklet sig til desktoppen, hvor Linux 100% overtog styringen i 2003 og serverne samtidig blev til gateway, firewall og webserver mellem lokalnettet og ADSL-linjen. Er for tiden inkarneret Gentoo'ist men begynder at blive træt af evig konfigurering og får øjnene op for mere out-of-the-box distributioner som SLED, Fedora Core og Ubuntu.
Flyttede i 2006 til Bergen i Norge og fik job hos et teleselskab, hvor open source bliver brugt i stor stil. Blandt andet laves kundestyringsprogrammet i Ruby og alle servere kører enten FreeBSD eller Linux.