En rask presentasjon av D-BUS-basert automatisering

Programvare kan være veldig, veldig irriterende noen ganger. Gratis programvare er ikke noe unntak fra denne regelen, men har en stor fordel: hvis du bare har litt tålmodighet, kan du automatisere eller konfigurere til å fungere som du vil, nesten all aktivitet du kommer til tankene.

Vær oppmerksom på at jeg ikke snakker om å hacking faktisk kildekode ! Det som er flott her er at selv om du ikke er programmerer, er det nesten ingen grenser for hva du kan gjøre. Så lenge du selvfølgelig er villig til å investere litt tid på å kopiere, lime inn og finpusse - i skriptfiler - tekstkommandoer som er mye lettere å håndtere enn C / C ++ -kode. Fremfor alt er dette sant også for mange programmer med et grafisk grensesnitt . Du trenger bare å vite hva du skal se etter, og hvilke spørsmål du kan stille.

Gå inn på D-BUS

D-BUS er et fint eksempel på hva jeg snakker om: "en enkel måte for applikasjoner å snakke med hverandre og å lansere applikasjoner og demoner på forespørsel når deres tjenester er nødvendige." Ved å bruke grensesnittene beskrevet nedenfor, kan du be D-BUS-bevisste GUI-programmer om:

  • vis verdiene til noen variabler de bruker,
  • angi noen av disse variablene og
  • gjør noe

Du kan gjøre alt dette ved å skrive de riktige kommandoene med en ledetekst eller (mye bedre) lagre dem i et shell-skript.

Den praktiske konsekvensen er at du kan fortelle datamaskinen din å starte og kjøre av seg selv, i det minste delvis, mange GUI-programmer, akkurat som om du klikker på knappene deres. Selv når deres egne grafiske grensesnitt ikke viser noen måte å få det til, og det virker som du bare kan gjøre er å klikke som om det ikke var noen i morgen. På en måte er det som at D-BUS ga en måte å opprette og utføre "makroer", selv for applikasjoner som tilsynelatende ikke har noen makrofunksjon overhodet.

Hvordan "snakker" jeg D-BUS?

På moderne GNU / Linux-distribusjoner er det to måter å bruke D-Bus. Den ene er grafisk, den andre fungerer på kommandolinjen.

Qdbusviewer (se figur A ) viser alle D-BUS-klienter "koblet" til D-BUS på datamaskinen din.

Figur A

Klikk for å forstørre.

Øktbussen er brukerspesifikk; systembussen håndterer vanlige hendelser, for eksempel innsetting av USB-stasjoner eller andre maskinvarevarsler. Når du klikker på en klient, viser høyre rute, i en trelignende liste, alle "Metodene" som er tilgjengelige for den klienten, gruppert etter funksjon. Hvis du klikker på en metode, vil den nåværende verdien eller argumentene vises, og i noen tilfeller vil du endre den.

For en ikke-programmerer er den viktigste, om ikke bare, verdien til qdbusviewer som dokumentasjon og didaktisk verktøy. Et stort problem med denne typen hacking er at det nesten ikke er noen dokumentasjon som virkelig er rettet mot sluttbrukere. Qdbusviewer er den enkleste måten å vite hvilke metoder som er tilgjengelige for en gitt D-BUS-klient, hvilke verdier som er akseptable for dem, og hva hver verdi gjør.

Når du har fått den informasjonen, kan du bruke den til å skrive skript basert på D-BUS-kommandolinjeverktøyet, qdbus, som sjekker eller angir de riktige metodene.

Et praktisk eksempel: automatisering av skjermbilder

Et nyttig eksempel for å vise deg hva jeg mener er Ksnapshot-verktøyet. Bruksanvisningen sier at du kan se på D-BUS-grensesnittet og henholdsvis alle metodene for å kontrollere det med disse to kommandoene:

 qdbus org.kde.ksnapshot-`pidof -s ksnapshot` 
 qdbus org.kde.ksnapshot-`pidof -s ksnapshot` / KSnapshot 

Den andre kommandoen produserer en liste over metoder hvis navn tilsvarer, som forventet, med ting du kan gjøre eller angi i det grafiske grensesnittet til Ksnapshot:

  -postbeskyttet ~ $ qdbus org.kde.ksnapshot-`pidof -s ksnapshot` / KSnapshot 
 method void org.kde.ksnapshot.exit () 
 metode int org.kde.ksnapshot.grabMode () 
 method bool org.kde.ksnapshot.save (QString-filnavn) 
 method void org.kde.ksnapshot.setGrabMode (int grab) 
 method void org.kde.ksnapshot.setTime (int newTime) 
 method void org.kde.ksnapshot.setURL (QString newURL) 

(Merk at dette bare er en delvis utgang.)

Imidlertid er det både enklere og morsommere å studere hvordan D-BUS kan automatisere ting via qdbuswiewer, eller gjennom dette Ksnapshot-kontrollskriptet av powtrix. Her vil jeg bare vise deg den sentrale delen av koden for å gi deg et inntrykk av hvordan det fungerer:

 kstart -ikonifiser ksnapshot && sleep 0.2 
 mens "$ PID" == ""; gjør PID = "$ (pgrep ksnapshot)"; ferdig 
 Program = "org.kde.ksnapshot - $ {PID}" 
 qdbus $ -program / KSnapshot setGrabMode "$ 1" 
 qdbus $ -program / KSnapshot setTime 0 
 qdbus $ program / KSnapshot slotGrab 
 sove 8 
 qdbus $ -program / KSnapshot setURL "$ {NAME}" 
 qdbus $ program / KSnapshot slotSave 
 qdbus $ -program / KSnapshot exit 

De første linjene starter ksnapshot i bakgrunnen og får sitt prosessidentifikasjonsnummer ($ PID). Resten av koden bruker qdbus for å sette Grab-modus til Window, hele skjermen eller rektangulært område, som spesifisert av brukeren, og deretter griper øyeblikksbildet og lagrer det i filen som heter $ NAME.

Det skriptet gjør det mye raskere å ta skjermbilder med jevne mellomrom, for eksempel som bilder til en tutorial du kanskje skriver: legg koden i en loop og glem den. Hvis du valgte den rektangulære områdemodusen, kan det hende du må velge den manuelt hver gang, men det er ganske mye det.

Dette andre skriptet av Azziz bruker den samme teknikken for å kontrollere Spotify mediespiller for Linux via tastatur, med tilpassede snarveier.

Disse to eksemplene viser hvor enkelt det er å kontrollere programvare via D-BUS når du vet nøyaktig hva du vil automatisere, og hvor du skal dra for å gjøre det. Du er selvfølgelig velkommen til å lenke til dine egne eksempler i kommentarene! Mer informasjon er i D-Bus-opplæringen. I mellomtiden ønsker jeg deg masse moro med D-BUS-skripting.

© Copyright 2021 | mobilegn.com