Журнал LinuxFormat - перейти на главную

LXF79:DCOP

Материал из Linuxformat
Версия от 16:19, 27 апреля 2008; Lockal (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Добавить новые возможости KDE-приложениям и контролировать их удалённо – нет ничего проще, если вы используете DCOP. Нейл Ботвик (Neil Bothwick) покажет вам, как это делается.

Содержание


Хотя DCOP даёт вам огромные возможности по управлению вашей системой, вы скорее всего вообще никогда о нём не слышали (разве что, может быть, видели, как это слово мелькало в числе непонятных сообщений, отображающихся при запуске KDE-приложения из окна терминала). Средний пользователь KDE даже не подозревает про Desktop Communication Protocol, хотя он и является фундаментальной частью KDE. Но я думаю, что вам понравится разбираться в нём в процессе чтения этой статьи.

DCOP – это протокол межпроцессного взаимодействия, то есть с его помощью разные KDE-приложения могут общаться друг с другом. Например, именно через него вы можете запустить KMail и KAddressBook из приложения Kontact. Я собираюсь показать вам, как вы можете использовать DCOP для взаимодействия с программами KDE из командной строки или из сценария, добавлять возможности и автоматизировать операции, чего иначе было бы невозможно добиться.


Определение макроса звучит так: это серия нажатий на клавиши, которая эмулирует отсутствующую, но нужную команду. DCOP позволяет добиться того же самого в KDE: добавить функциональность, которая изначально отсутствовала. Чтобы понять, что я имею в виду, посмотрите на следующий пример использования DCOP:

rm -i $(dcop kdesktop KBackgroundIface currentWallpaper 0)

В моем профиле Bash определен псевдоним для этой команды, и я использую его всякий раз, когда мне нужно удалить фоновую картинку на рабочем столе. У меня есть вредная привычка собирать картинки всевозможных сортов и складывать их в тот каталог, из которого KDE берёт обои для рабочего стола, изменяя их через определённый интервал. Очень часто оказывается, что оказавшаяся на рабочем столе картинка мне не нравится... И тогда при помощи этой команды я нахожу файл текущей картинки рабочего стола и удаляю его.

В этом сценарии dcop запрашивает имя текущего изображения на рабочем столе у программы Kdesktop. Число 0 обозначает текущий рабочий стол; чтобы сослаться на первый, вы можете использовать число 1, и так далее. Результат выполнения команды dcop передаётся команде rm, и ужасная картинка исчезает.

Простой путь к DCOP

Как узнать, что dcop может сделать с программой вроде Kdesktop и какие аргументы при этом используются? Один из способов – это исследование исходного кода программы и попытка понять, как в ней реализован интерфейс DCOP (это средство, с помощью которого программы обмениваются DCOP-сообщениями). К счастью, есть и более простой способ – KDCOP. Эта графическая программа показывает в виде дерева все приложения, в которых реализованы интерфейсы DCOP. Открыв ветку приложения, можно увидеть список поддерживаемых интерфейсов, каждый из которых включает множество функций. Большую часть интерфейсов вы можете смело проигнорировать, из них вам нужен один единственный, который обычно называется MainApplication-Interface.

Для тестирования функции дважды щелкните по ней. Результатом будет либо возвращенное функцией значение, либо реакция самого приложения. Например, двойной щелчок на Kdesktop > KbackgroundIface > ChangeWallpaper приведёт к тому, что фоновое изображение рабочего стола изменится на следующую картинку из списка (если вы, конечно, указали KDE использовать серию картинок для фона рабочего стола).

Внизу окна KDCOP вы можете увидеть, какую команду DCOP вы только что выполнили. Для ее вызова при помощи утилиты dcop, нужно лишь заменить точки на пробелы. Например, следующая функция

DCOP call kdesktop.KBackgroundIface.changeWallpaper()

может быть вызвана при помощи команды

dcop kdesktop KBackgroundIface changeWallpaper

Если функция требует какие-то аргументы, перечислите их без скобок через пробел, как это принято в сценариях командной строки.

Другой способ посмотреть доступные операции – утилита командной строки dcop. Например,

dcop kdesktop KbackgroundIface

покажет список функций, доступных в kdesktop, в том числе, CurrentWallpaper.


Вы могли заметить, что названия некоторых узлов первого уровня в дереве KDCOP содержат не только имена приложений, но и числа. Это идентификаторы процессов (PID), они добавляются в том случае, когда одновременно может быть запущено больше одной копии приложения. Например, каждое окно Konqueror представляет собой отдельный процесс, так что все вхождения Konqueror в KDCOP указываются вместе с PID, даже если в данный момент открыто всего лишь одно окно. С другой стороны, Amarok можно запустить только в единственном экземпляре.

Попытка запустить его повторно приведёт к тому, что будет открыто окно текущего приложения. Поэтому ветвь Amarok не сопровождается номером.

Для того, чтобы использовать интерфейс DCOP для «нумерованного» приложения, вы обязательно должны правильно указать номер процесса. Существуют разные способы узнать нужный номер из сценария командной строки. Если вы запустили приложение из того же сценария, то PID процесса вам уже известен – он хранится в переменной $!.

konqueror http://www.site1.com &
dcop konqueror-$! konqueror-mainwindow#1 newTab http://www.site2.net
dcop konqueror-$! konqueror-mainwindow#1 newTab http://www.site3.org
dcop konqueror-$! konqueror-mainwindow#1 newTab http://www.site4.co.uk

Первая строка открывает окно Konqueror и загружает в него web-страницу. В переменной $! хранится PID последнего фонового процесса, запущенного из данной оболочки, так что в следующих трёх строчках мы можем использовать полученное значения для подгрузки трёх новых вкладок в том же самом окне Konqueror.

Другой способ получить нужные номера – это использование правил подстановки, подобных правилам подстановки в оболочке командной строки, примерно так:

dcop konqueror-*

Эта команда вернёт список PID всех экземпляров Konqueror. Если вы запускаете команду или содержащий ее сценарий при помощи горячей клавиши, вы можете захотеть выбрать активное окно, примерно так:

for IFACE in $(dcop konqueror-*)
do
if [ $(dcop ${IFACE} konqueror-mainwindow#1 isActiveWindow) == "true" ]
then
MYIFACE=${IFACE}
break
fi
done

Этот сценарий перебирает все экземпляры Konqueror до тех пор, пока не найдёт активный. Чтобы узнать, как это делается, вам потребуется KDCOP, поскольку для разных приложений эта команда разная.

GUI к оболочке командной строки

Теперь, когда вы получили общее представление о DCOP, позвольте мне показать несколько интересных примеров его использования. Спросите у здравых пользователей Linux, что они предпочитают – GUI или командную строку, и они ответят, что пользуются и тем и другим, переключаясь по мере надобности. Вот небольшой сценарий DCOP, упрощающий эту задачу. На вашем месте я бы сохранил его, привязав к горячей клавише для запуска при работе c Konqueror как файловым менеджером.

#!/bin/sh
#Включите приведенный выше код для поиска интерфейса Konqueror
if [ -n «${MYIFACE}» ];
then
konsole --workdir $(dcop ${MYIFACE} konquerormainwindow#1
currentURL | cut -c 8-)
fi

Konqueror возвращает текущий путь в виде полного URL, но Konsole не понимает присутствующего в его начале 'file://', так что мы удаляем его командой cut.


Попробуем теперь рассмотреть второй пример. Я написал эту статью в Kate, текстовом редакторе из KDE. В целом Kate мне нравится, но серьёзным упущением является отсутствие счётчика слов (не говорите мне, что это редактор программного кода, у него же есть проверка орфографии, так ведь?). К счастью, благодаря DCOP добавить подсчёт слов очень просто.

#!/bin/sh
for IFACE in $(dcop kate-*)
do
 if [ $(dcop ${IFACE} __KateMainWindow#1 isActiveWindow) == "true" ]
 then
 MYIFACE=${IFACE}
 break
 fi
done
if [ -z "${MYIFACE}" ]
then
 RESULT="No active Kate window found"
else
 ALL=$(dcop ${MYIFACE} EditInterface#1 text | wc -w)
 SELECT=$(dcop ${MYIFACE} SelectionInterface#1 selection | wc -w)
 RESULT="All text: ${ALL} words\nSelected: ${SELECT} words"
fi
kdialog --title "Kate word count" --msgbox "$RESULT"

Этот сценарий находит активное окно Kate (если такое есть), а затем, с помощью функций EditInterface и SelectionInterface читает весь текст в окне и в выбранном отрывке. Утилита dcop отправляет полученные данные в стандартный поток вывода, так что сценарий может перенаправить его в утилиту wc для подсчёта числа слов. Как всегда, проще всего вызывать такой сценарий с помощью горячей клавиши.

Другие языки

Мы с вами рассмотрели, как использовать dcop для управления при ложениями KDE из командной строки или сценария оболочки, который можно вызывать по горячей клавише. Но поскольку протокол DCOP был придуман для того, чтобы облегчить взаимодействие программ между собой, его можно использовать во многих других языках программи рования. Графическое приложение KDCOP может показать синтаксис вызова для Python и C++ точно так же, как для сценария оболочки. Если вы хотите использовать DCOP в своей программе для вызова других приложений или же хотите предоставить доступ извне к функциям вашего, изучите официальную документацию (с множеством примеров) на developer.kde.org/documentation/other/dcop.html.

Если вы – счастливый обладатель пульта дистанционного управления (например, от TV-тюнера) и lirc, перед вами открывается море новых возможностей. KDE позволяет назначить ответные действия для небольшого числа приложений, в основном, мультимедиа-проигрывателей – ищите их в KDE Control Center. Там же можно включить KDE Program Launcher, посредством которого легко запустить утилиту dcop и управлять приложениями KDE с пульта ДУ!

KDE иногда критикуют за то, что в нем слишком много опций. Но сколько бы возможностей ни предусмотрел автор программы, всегда может оказаться, что чего-то не хватает. К счастью, благодаря DCOP в KDE вы можете самостоятельно добавить то, что вам нужно.

Персональные инструменты
купить
подписаться
Яндекс.Метрика