Brug scripter med skrivebordet

KDE sørger for et kraftfuldt kommunikationssystem mellem processer med DCOP, Desktop COmmunication Protocol. Ved at bruge DCOP kan du styre et stort antal funktioner i KDE fra kommandolinjen eller fra et script skrevet i dit foretrukne scriptsprog. Du kan også få information fra KDE-programmer: for eksempel sørges der i flere mediaafspillere i KDE for metoder til at spørge afspilleren om information om sporet som for øjeblikket afspilles.

Generelt set sørger hvert KDE-program for et eller flere DCOP grænseflader, som på sin side sørger for metoder (eller hvis du foretrækker det, funktioner) som andre programmer kan kalde. Det første skridt i at skrive vort script er altså at finde en passende metode til at ændre desktoppens baggrundsfarve. Den nemmeste måde at gøre dette er at bruge grænsefladen kdcop for at se de tilgængelige DCOP-metoder.

Kør kdcop fra en terminal eller Kør program (vinduet som dukker op med Alt+F2). Vinduet kdcop viser de programmer som for øjeblikket kører og sørger for en DCOP-grænseflade, med en trævisning. Generelt kræves en vis gennemsøgning i trævisningen for at finde den rigtige metode, men et nyttigt vink er at grænsefladen markeret “(default)” almindeligvis indeholder de oftest bruge funktioner.

For at teste at funktionen gør det vi forventer os, dobbeltklikkes på indgangen setColor. For at angive farven c, klikkes på farvevælgerknappen og en farve vælges. Angiv om farven skal være farve A med afkrydsningsfeltet. Klik på O.k. så ændres baggrundens farve.

For at få adgang til DCOP-metoden fra dit foretrukne scriptsprog, kan du enten bruge DCOP-bindninger, om de er tilgængelige i modulet kdebindings, eller kalde kommandoradsprogrammet dcop. For enkel brug er det tilstrækkeligt at kalde kommandoradsprogrammet dcop. For at kalde en DCOP-metod på kommandolinjen, skal vi angive programmet og grænsefladen som metoden tillhør, selva metoden og argumenten på en form som er læmplig for skallen.

Vi angiver program, grænseflade og metode i denne rækkefølge, fulgt af argumenterne i samme rækkefølge som de vises i kdcop. dcop har mange andre tilvalg: Kig engang på udskriften fra dcop --help.

Det er nok med teori. Tid til et eksempel:

Eksempel 15.1. Et script til at ændre desktoppens farve med DCOP

Ved hjælp af kommandolinjeprogrammet dcop og lidt kode i Perl, vil vi lave et enkelt script som langsomt lader desktoppens baggrund gå gennem spektret cyklisk.

Først kigger vi efter en passende medode med kdcop. I dette eksempel går vi forbi søgningen, og går direkte til den: Metoden vi vil have er kdesktop->KBackgroundIface->setColor. Funktionens argument og returtype vises med stilen i sproget C++. For setColor, er argumentet en farve, c, som angiver den nye baggrundsfarve, og en Boolesk værdi, isColorA som angiver om farven er den første eller anden (dette er nyttigt for at angive toninger med mere).

For at bruge metoden setColor på kommandolinjen, bruger vi følgende:

% dcop kdesktop KBackgroundIface setColor '#ffffff' false

For at angive farven bruger vi den hexadecimale RGB-værdi, som bruges af HTML. Bemærk at den er omgivet af enkle citationstegn, for at beskytte # fra skallen.

For at finde den hexadecimale RGB-værdi for en farve, åbnes en farvevalgsdialog i et KDE-program (for eksempel i KDE's kontrolcenter, Udseende og temaer->Farver), vælg farven du vil have, og brug værdien som angives i tekstfeltet HTML.

Det er altså alt vi behøver fra DCOP. Nu er det kun spørgsmålet om at skrive et script omkring det. Her er en (meget) grov implementering:

$min=49;  # Minimal værdi for farven R, G eller B
$max=174; # Maksimal værdi for farven R, G eller B
$step=5;  # Værdi at stige farven med for hvert skridt
$sleeptime=15; # Interval i sekunder mellem hvert skridt

@start = ($max, $min, $min);
@colour = @start;

while (1) {
        foreach (0..5) {
                my $which = $_ % 3; # Hvilken farve (R, G eller B) som skal ændres
                my $updown = $_ % 2; # Om farvens værdi skal øges eller mindskes
                do {
                        if ($updown == 0) { $colour[$which]+=$step; }
                        if ($updown == 1) { $colour[$which]-=$step; }
                        my $dcopcall=sprintf "dcop kdesktop KBackgroundIface setColor '#%x%x%x' true\n", @colour;
                        system($dcopcall);
                        sleep $sleeptime;
                        } while (($colour[$which] 
>= $min) and ($colour[$which] <= $max));
                }
}

Kør blot scriptet uden argument så går det cyklisk gennem baggrundsfarver i et noget begrænset spektrum indtil det afbrydes. Voilà!

Perl er naturligvis ikke det eneste sprog du kan bruge til at skrive scripter med DCOP. Hvis du foretrækker skalscript, er det også tilgængeligt:

Eksempel 15.2. Hent en baggrund fra internettet

Følgende script henter hovedbilledet fra serien “User Friendly” og bruger det som naggrundstapet, med almindeligt tilgængelige værktøjer og en lille smule DCOP:

#!/bin/sh
COMICURL=`wget -qO - http://www.userfriendly.org/static/index.html | \
          grep Latest | sed -e "s,.*SRC=\",," -e "s,\"
>.*,,"`
TMPFILE=`mktemp /tmp/$0.XXXXXX` || exit 1
wget -q -O $TMPFILE $COMICURL
dcop kdesktop KBackgroundIface setWallpaper $TMPFILE 1

Den første linje efter #!/bin/sh bruger wget og lidt magi med regulære udtryk for at plukke billedets sted ud fra hovedsidens HTML-kode. Den anden og tredje linje henter billedet, og til sidst sætter dcop billedet som baggrundsbillede.

Relateret information