DCOP - komunikacja międzyprocesowa
Zastanawialiście się kiedyś, czemu Iceweasel tak chętnie 'wskakuje' na pasek kicker, Opera tak ładnie ładuje się do tray'a a Wasz ulubiony player muzyczny oferuje Wam wygodne sterowanie głośnością czy też paskiem postępu utworu przez mini-interfejs? Desktop Communication Protocol [DCOP] to protokół umożliwiający komunikację między procesami w środowisku KDE3. W momencie gdy piszę te słowa KDE4 zbliża się wielkimi krokami (3 miesiące), a wraz z nim całkowite odejście od DCOP w kierunku D-BUS SYSTEM, więc póki jeszcze czas postaram się opisać to cudowne narzędzie - ot dla potomnych :-).
Przyjrzyjmy się zatem interfejsowi DCOP, a konkretniej - klientem DCOP. Używając skonfigurowanego dopełniania poleceń w Bashu możemy przeglądać strukturę aplikacji w bardzo wygodny sposób.
$ dcop kaccess khotkeys kmix ksmserver kcookiejar kicker knotify kwin kded klauncher konqueror-6695 kdesktop klipper konsole-9344
Widzimy tutaj wszystkie programy korzystające z interfejsu DCOP do wymiany informacji. Chcemy "skontaktować się" z kmix odpowiadającym za mikser systemowy. Wpiszmy zatem:
$ dcop kmix kmix Mixer0 kmix-mainwindow#1 Mixer1 MainApplication-Interface qt
Otrzymaliśmy wykaz wszystkich funkcji, jakie oferuje nam kmix. Posiadam w systemie dwie karty dźwiękowe, zatem mam do dyspozycji Mixer0 oraz Mixer1. Sprawdzę, czy Mixer0 to moja podstawowa karta dźwiękowa.
$ dcop kmix Mixer0 mixerName Intel 82801DB-ICH4
Tak jest. Zacznijmy zatem "magię". Mixer0 oferuje nam takie funkcje:
$ dcop kmix Mixer0 absoluteVolume int mute setMute absoluteVolumeMax interfaces open setRecordSource absoluteVolumeMin isAvailableDevice QCStringList setVolume bool isRecordSource QString toggleMasterMute close long setAbsoluteVolume toggleMute decreaseVolume masterMute setBalance void functions masterVolume setMasterMute volume increaseVolume mixerName setMasterVolume
I już po krótkiej zabawie możemy (konsolowo!) zmieniać głośność, wyciszać kartę czy też nawet zamknąć program. Aby dowiedzieć się, w jaki sposób używać wybranej funkcji wpisujemy:
$ dcop kmix Mixer0 QCStringList interfaces() QCStringList functions() void setVolume(int deviceidx,int percentage) void setMasterVolume(int percentage) void increaseVolume(int deviceidx) void decreaseVolume(int deviceidx) int volume(int deviceidx) int masterVolume() void setAbsoluteVolume(int deviceidx,long int absoluteVolume) long int absoluteVolume(int deviceidx) long int absoluteVolumeMin(int deviceidx) long int absoluteVolumeMax(int deviceidx) void setMute(int deviceidx,bool on) void setMasterMute(bool on) void toggleMute(int deviceidx) void toggleMasterMute() bool mute(int deviceidx) bool masterMute() void setRecordSource(int deviceidx,bool on) bool isRecordSource(int deviceidx) void setBalance(int balance) bool isAvailableDevice(int deviceidx) QString mixerName() int open() int close()
Skorzystajmy z tego i wyciszmy naszą kartę:
$ dcop kmix Mixer0 setMute 0 1
I ponownie ją włączmy:
$ dcop kmix Mixer0 setMute 0 0
Zabawy z DCOP nie ograniczają się tylko do tak prostych spraw, jak sterowanie głośnością czy zamykanie aplikacji. Pokaże Wam teraz, jak można użyć DCOP do oskryptowania własnego "wyświetlacza" tekstów aktualnego utworu na ekranie. Potrzebujemy do tego uruchomionego Amaroka.
$ dcop amarok player
Nie wklejam tutaj wyniku tej komendy, gdyż jest on zbyt duży :-). Amarok daje nam dostęp do tak wielkiej ilości funkcji poprzez interfejs DCOP, że z wykorzystaniem języków skryptowych możemy napisać własny "wrapper" czy też mini-interfejs dla tej kobyłki. Zobaczmy na kilka przykładów:
$ dcop amarok player nowPlaying LOST HORIZON - World Through My Fateless Eyes
$ dcop amarok player currentTime 0:48
$ dcop amarok player lyrics
Ostatnia komenda pokaże nam tekst aktualnie odtwarzanego utworu (o ile mamy skonfigurowany moduł Lyrics w skryptach Amaroka). Jak zatem pokazać to cudo na ekranie? Skorzystamy z Conky :-). Najpierw stwórzmy skrypt "lyrics"
$ cat /bin/lyrics
#!/bin/bash
dcop amarok > /dev/null
if [ $? != 0 ]; then
echo "Amarok nie jest włączony";
else
dcop amarok player lyrics
fi
exit 0
I podepnijmy go pod Amaroka (linijka do wklejenia w Conky'm, wyjście poddane obróbce "śmieci" xml'a).:
${execi 10 lyrics | tail -n +2 | sed "s/'/'/g"}
Tym oto prostym sposobem zmusiliśmy Conky do ukazywania tekstu aktualnego utworu. Podobnie możemy konfigurować swoje skrypty odwołujące się do danego programu (co widać w skrypcie "lyrics" w instrukcji warunkowej 'if'. Ale czy to koniec?
Oczywiście że nie! Czemu by nie użyć DCOP jako systemu powiadomień (np. o nowej poczcie, albo o wydarzeniu)? To się da zrobić!
$ dcop knotify default notify eventname appname 'Witaj swiecie!' '' '' 2 0
Opis poszczególnych parametrów funkcji "notify" uzyskamy poprzez:
$ dcop knotify Notify | grep notify void notify(QString event,QString fromApp,QString text,QString sound,QString file,int present,int level) void notify(QString event,QString fromApp,QString text,QString sound,QString file,int present,int level,int winId) void notify(QString event,QString fromApp,QString text,QString sound,QString file,int present,int level,int winId,int eventId)
Jak widzicie interfejs DCOP jest bardzo wygodny dla programistów języków skryptowych (np. jak w moim przypadku - Basha). Sprawia, że moje programy otrzymują nowe funkcjonalności i działają w różnych warunkach (np. potrafią sprawdzać, czy dany program jest uruchomiony czy nie, jeśli nie wyświetlać graficzne powiadomienie itp.). DCOP posiada jeszcze jeden, ogromny plus. Jest bardzo szybki. W moim odczucie o wiele szybszy od D-BUS. Nie rozumiem czemu twórcy KDE4 zrezygnowali z DCOP. Obiecują interfejs zastępczy, wrapper zapytań. Mówią że będzie kompatybilnie. Już to widzę... Ja od DCOP niezbyt chcę odchodzić. I na koniec kilka ciekawostek:
$ dcop kdesktop KDesktopIface runAutoStart
W ten sposób KDE uruchamia wbudowany Autostart.
$ dcop kdesktop KBackgroundIface setWallpaper
Wasz program ma zmieniać domyślną tapetę?
$ dcop kdesktop KDesktopIface setIconsEnabled
Ukrywać ikony?
$ dcop knotify default notify eventname appname 'Gorion TVN-Style HACK3d!!!!111' '' '' 2 0
I straszyć kumpla? :-)) Życzę Wam miłej zabawy w odkrywaniu możliwości tego systemu!
I jak zwykle: ENJOY! Bo Linux to masa zabawy :-)
Pytanie na marginesie: czy Gnome posiada podobny interfejs? Czy używa D-BUS? Przyznaję - nie wiem bo nie używam od bardzo dawna.
Tak, gnome używa d-bus :)
@Mateusz - dzięki :-) W takim razie zainteresuję się. Może to i lepiej, integracja komunikacji międzyprocesowej KDE i Gnome wyjdzie tylko na dobre - moje skrypty będą działać w Gnome ;-)))
Przypominam o programiku KDCOP, czyli graficznej przeglądarce/kliencie DCOP.
Zawsze się zastanawiałem po co stworzono kdcop. Interfejs DCOP ma służyć do komunikacji programów między sobą z wykorzystaniem klienta DCOP. Po co przeglądarka, w której nic się nie da zrobić (tzn. da się wyklikać, ale po co mam "klikać" skoro mam do tego skrypt z 1 komendą? :-)).
kdcop to jedno wielkie nieporozumienie.
Uważam KDCOP za świetne narzędzie. Załóżmy, że chcę przez xbindkeys czy LIRC-a sterować jakimś programem, ot, choćby właśnie Amarokiem. Czy wygodniej jest szukać odpowiednich kodów w konsoli, czy wyklikać sobie w drzewie w oknie KDCOP?
A używanie KDCOP do sterowania czymkolwiek? Oczywiście, to byłoby nieporozumienie i nawet przez myśl mi to nie przeszło.
Chyba jestem zatem jakiś inny :P. Szybciej docieram do interesujących mnie funkcji przez dopełnianie w konsoli niż przeklikiwanie się przez multum opcji. Jakkolwiek - skoro komuś to służy to ok :)
Wow night zaskoczyłeś mnie, super art! :)
Jedno pytanie mam: czy Opera korzysta z DCOP w ogóle (chodzi mi o pierwsze zdanie artykułu)? Nie wydaje mi się, by można było ją kontrolować tak jak np. amaroka -- a szkoda :)
No i uniwersalne współpracowanie z trayami to nie zasługa DCOP-a, tylko chyba tego standardu forsowanego przez freedesktop.org. Ale to tylko tak na boku wtrącam.
@radmen - cieszę się :-) Mam w planach dogłębne poznanie d-bus, jednak muszę nad tym posiedzieć.. DCOP mnie 'kręci' przez o wiele dłuższy czas.
@Hoppke - Witaj! Miło Cię widzieć na moim Jogu. Opera nie korzysta z DCOP w takim stopniu jak Amarok, jednak każdy program, nawet gdy Twórca nie zaimplementował obsługi DCOP, obsługuje podstawowe funkcje (np. minimize() czy właśnie hide()). Link do źródła tej wiedzy: http://tinyurl.com/2qwncp
http://tinyurl.com/34x7pb oraz własne spostrzeżenia :-) Opera jest napisana w QT i chcąc nie chcąc wykorzystuje minimum interfejsu DCOP. Choć przyznaję - nie używam tej przeglądarki (mimo wielu prób przekonania się do niej).
Sprawa korzystania z tray'a jest rzeczywiście ciekawa i wydaje mi się, że jest to świetny pomysł na kolejny art z mojej strony:). Rzeczywiście, freedesktop 'forsuje' pewne standardy za którymi muszą iść tak KDE, jak i Gnome czy też XFCE, jednak większość aplikacji wbudowanych w KDE ma własne systemy obsługi (realizowane właśnie przez DCOP).
Dziękuję za komentarze :-) Aż się chce pisać dalej! (i nie mam tu na myśli How-To'sów "jak zainstalować kadu" :-))