Powstanie artykułu: 17.07.2012

Komunikacja międzyprocesowa

W ramach projektu Freedesktop ostatnio w środowiskach graficznych, i nie tylko, wprowadza się wiele nowych mechanizmów. Wśród nich znajdziemy udeva, udisks, polkita, pulseaudio, dbusa i św. pamięci HAL-a.

Dbus to program służący do tzw. komunikacji międzyprocesowej. Pozwala ona twórcy programu x korzystać z funkcji programu y. Każdy program posiada metody, dzięki którym możemy używać jego funkcji i kontrolować okna.

Oprócz standardowych wywołań dla KDE, GNOME i Qt, takich jak choćby zamknięcie programu, każda aplikacja posiada swoje specyficzne wywołania, którymi zwykle zajmuje się autor.

Dbus, qdbus, qdbusviewer – praktyczne przykłady

Czy Dbusa można wykorzystać do czegoś ciekawego? Okazuje się, że można. Programy udostępniają różne interfejsy za pośrednictwem szyny Dbusa, co umożliwia ich kontrolę: wyświetlenie nowego okna, nowej karty, podanie jakichś argumentów; w przypadku odtwarzacza muzycznego można kontrolować odtwarzanie. Środowisko graficzne także posiada wiele sterowalnych elementów: wygaszacz ekranu, okno uruchamiania programów, menu programów, zarządzanie energią, wyświetlanie poszczególnych paneli, głośność itp. Za przeglądarkę tych interfejsów i aplikację do wysyłania sygnałów do procesów posłużą nam qdbus i qdbusviewer.

Wyświetlanie nowej karty za pomocą gestu myszy

Wszystkich zainteresowanych otworzeniem nowej karty w Firefoksie czy funkcjonalnością Do tyłu / Do przodu informuję, że Firefox ciągle nie obsługuje wywołań Dbusa (prawdziwe dla wersji 14.0.1). Można to jednak uzyskać innymi metodami. Tutaj skupimy się na Dolphinie.

Usługa dolphina w dbusie

Dolphin nowa karta

Niestety nic nam to nie daje, jako że klikać każdy głupi umie, a my potrzebujemy tego samego jako polecenia basha, aby móc sobie go przypisać do gestu myszy.

Skąd to się wzięło?

Mamy już polecenie do otwarcia nowej karty (powyżej). Nie znamy identyfikatora sesji (13311), który się przeciez zmienia, i nie mamy procedury do identyfikacji okna, nad którym znajduje się kursor myszy wykonujący gest skojarzony z poleceniem otwarcia nowej karty.

Jak widać mamy nasze numerki. Potrzebne będzie polecenie, które je wyodrębni:

Mamy identyfikatory sesji, nie wiemy jednak, które okno właściwie jest otwarte. Można to na szczęście sprawdzić w Dbusie:

Dolphin czy okno jest aktywne?

I polecenie:

Po co sleep 2? Te dwie sekundy umożliwiają aktywację okna kursorem myszy: normalnie w chwili wykonania polecenia aktywna byłaby konsola, więc zwracana wartość zawsze byłaby równa false. W skrypcie nie stosujmy jednak tego.

Mamy numery instancji, wiemy jak sprawdzić która z nich jest aktywna. Najwyższy czas połączyć te umiejętności w skrypt otwierający nową kartę w Dolphinie:

W przypadku awarii usługi pastebin, skorzystaj z lokalnej kopii: skrypt otwierający nową kartę w Dolphinie.

A co z gestem myszy? KDE posiada mechanizm Hotkeys, który umożliwia łatwe przypisanie skryptu do gestu myszy:

khotkeys, tworzenie nowego gestu

Rysujemy nowy gest myszy (aby narysować równie idealny gest jak ja, posłuż się sterowaniem myszy z klawiatury numerycznej):

khotkeys, tworzenie nowego gestu cd

Po wciśnięciu przycisku Ustawienia obok Edycja można wybrać, którym przyciskiem myszy chcemy wykonywać gesty w systemie. Na karcie Działanie naszego gestu wybieramy plik z utworzonym przez nas skryptem. Pamiętajmy o bicie wykonywalności (chmod +x). Nasz gest działa:

Dolphin z nową kartą uruchomioną gestem myszy

Wyświetlenie krunnera

Uruchomienie krunnera za pomocą linii poleceń trwa dłużej niż wyświetlenie już uruchomionej instancji, która działa podczas pracy KDE.

krunner uruchomiony gestem myszy

W konfiguracji KDE Hotkeys wystarczy przypisać gest do polecenia:

Jest to skrócona forma dla pogramów KDE, które nie wymagają podawania nazw usług. Tak wygląda pełna forma:

Zdalna kontrola audaciousa

Aby zastosować interfejs Dbus do kontroli audaciousa, wystarczy przypisać żądane polecenia do skrótów klawiszowych lub gestów myszy, lub też wpisywać je przez ssh:

Polecenie wyświetlające dane o utworze w audaciousie:

Montowanie i odmontowywanie za pomocą Dbusa

Na karcie System Bus w qdbusviewerze znajduje się szereg poleceń związanych z działaniem samego systemu operacyjnego, takich jak hibernacja, wyłączanie, wyświetlenie urządzeń dyskowych i inne. Aby wywołać zamontowanie i odmontowanie pendrive'a za pomocą udisks przez Dbusa, można posłużyć się na przykład takim poleceniem:

Wytłumaczenie: --system mówi, że usługa znajduje się w szynie systemowej, a nie w szynie otwartej sesji. auto i rw to argumenty metody FilesystemMount. Do tej pory nie spotkaliśmy się z argumentami. Aby poznać listę możliwych argumentów dla UDisks, musimy się udać do katalogu /usr/share/dbus-1/interfaces/ i poszukać XML-a, który zawiera w treści FilesystemMount. Domyślna wyszukiwarka Dolphina tego nie znajdzie, ale kfind już tak. Jest to plik /usr/share/dbus-1/interfaces/org.freedesktop.UDisks.Device.xml: Mount Options. Valid mount options include mount options accepted by the native mount program. The option auth_no_user_interaction can be used to avoid user interaction (e.g. authentication dialogs) when checking whether the caller is authorized. Problem w tym, że to bzdura i wcale nie wszystkie opcje są akceptowane. Lepiej jest z odmontowywaniem:

Unmount options. Valid options currently include only force.