LXF95:DCOP

Материал из Linuxformat.

Перейти к: навигация, поиск
HardcoreLinux Проверьте себя как продвинутого пользователя

Содержание

DCOP: Моддинг в ситле KDE

Нравится идея менеджера виртуальных рабочих столов для KDE? Грэм Моррисон покажет, как автоматизировать KDE через функции DCOP.

У KDE больше функций на каждый пиксель, чем у любого другого рабочего стола, который я в силах припомнить. Это источник гордости и критики для пользователей, которые или обожают, или ненавидят эту бездну настроек. Пользователи KDE привыкли тонко регулировать все аспекты пользовательского интерфейса, как через KControl, так и с помощью диалогов настроек каждого приложения. Но большинство пользователей и не подозревают, что KDE предоставляет механизм настроек поинтереснее, чем пара-тройка панелей и вкладок.

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

DCOP для масс

Вы будете работать с функциями, причем компьютерными. Единственное их сходство с математическими собратьями – то, что они обрабатывают данные и выводят результат. Эти функции являются строительными блоками приложения, в основном используемыми для разбиения больших задач на мелкие фрагменты. Например, вы можете захотеть иметь функцию для свертывания или развертывания окна на рабочем столе. Пользователю незачем знать, какая функция скрывается за данной возможностью: ему нужно только, чтобы при нажатии на определенную иконку происходило определенное действие.

Свертывание и развертывание окон было выбрано не случайно. У всех приложений KDE есть функции для выполнения этих задач, и вот здесь может помочь DCOP [небольшое отступление: функциональность, сходной с DCOP, но не завязанной на KDE, обладает D-BUS – он-то и придет на смену DCOP в KDE4, – прим.ред.]. DCOP дает обычным пользователям доступ ко многим «закулисным» функциям, используемым приложениями внутри себя; он позволяет перенаправлять данные в приложение и из него, как будто вы являетесь разработчиком приложения. Конечно, обычные пользователи могут оробеть перед такими возможностями, но раз вы читаете эту статью, значит, вы не просто давнишний пользователь, верно?

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

При запуске каждое приложение присоединяет себя к общесистемному серверу DCOP – его-то вы и опрашивали командой ‘dcop’. Но самое интересное начнется, когда вы попытаетесь опрашивать работающие приложения. Например, наберите dcop kdesktop. Вы увидите список объектов верхнего уровня, использованных программистами для разработки приложения KDesktop – инструмента, ответственного за фон рабочего стола и прочие небольшие задачи. DCOP использует иерархию узлов для упорядочения доступных функций, и то, что вы видите, является списком узлов верхнего уровня присоединенных к KDesktop. Вы можете попробовать опросить любое приложение, встретившееся в выводе нашей первой команды dcop. Мы на самом деле уже использовали DCOP для манипулирования KDesktop пару лет назад в Совете месяца в разделе руководств LXF66, когда создавали небольшой скрипт для скачивания космического изображения дня с NASA и автоматической установки его в качестве фонового изображения.

Расшифровка синтаксиса с Kdcop

Такая гибкость является силой DCOP, а его возможности просто безграничны. Наилучший способ исследовать некоторые из этих возможностей – использовать графическую KDE оболочку для команды dcop, называемую Kdcop. Она редко встречается в системном меню, и вам, вероятно, потребуется запустить ее через пункт Запустить команду из меню KDE и набрать kdcop. Это отличная маленькая утилита, позволяющая исследовать различные KDE-приложения, их ассоциированные узлы DCOP и функции.

Пользовательский интерфейс Kdcop прост в понимании. Панель поиска наверху особенно полезна, так как обновляется в реальном времени. Попытайтесь набрать ‘Wallpaper’ в поле поиска – появится несколько записей насчет фона стола, присоединенных к объекту KBackgroundIface.

Рис. 1

Иногда без GUI невозможно понять, что делает очередная DCOP-функция: например, поле Position из KControl в DCOP называется Scale mode.

Функция, которую мы использовали в том Совете месяца, называлась void setWallpaper(QString wallpaper, int mode). Если вы никогда не занимались KDE-программированием, вам это мало что скажет – но вообще-то это простой C++ синтаксис для определения входных и выходных параметров [а также возвращаемого значения, – прим. ред.]. Сама функция называется setWallpaper, а значения в скобках – это два параметра, которые она требует на вход: текстовая строка, содержащая путь к изображению, и целое число, обозначающее режим использования. Что за режим? Вот и проявилась самая большая проблема с DCOP: формальной документации нет.

Если вы хотите понять, что делают параметры вроде mode, единственный способ это сделать – посмотреть исходный код приложения. Тем, кто использует DCOP с KDE-приложением, не являющимся основной частью рабочего стола, придется получить исходный код с домашней страницы проекта или со страницы SourceForge. К счастью, setWallpaper() является составной частью дистрибутива рабочего стола KDE, то есть вы можете посмотреть исходный код в режиме онлайн (см. http://techbase.kde.org) или установить пакеты разработки KDE [другие приложения также позволяют увидеть свой код в Сети, например, все проекты SourceForge предоставляют для этих целей ссылку Browse SVN, – прим.ред.]. В данном случае надо смотреть файл KBackgroundface.h, содержащий искомую функцию. Открыв его в текстовом редакторе, вы увидите примерно следующее (взято из KDE 3.5.6):

/** Change the wallpaper.
 * @param wallpaper The (local) path to the wallpaper.
 * @param mode The tiling mode. */

Это максимум, что удается извлечь, но кое-что про параметры DCOP понять можно: видно, что параметр mode определяет режим мозаики (tiling) при вставке изображения на рабочий стол. Именно он используется панелью KControl для изменения положения обоев в выпадающем меню Options. Использование DCOP часто требует подобной охоты за информацией о различных параметрах, но если вы знакомы с приложением, которым хотите управлять, то это не составит для вас большого труда.

Двойной щелчок на функции в Kdcop открывает небольшое окно, которое попросит вас ввести каждый из параметров в скобках. Здесь стоит сперва протестировать DCOP и удостовериться, что он делает именно то, чего вы ожидали. В setWallpaper, например, есть ошибка: функция не позволит вам установить последний из режимов (названный в KControl Масштабировать и Обрезать). Предположительно, это из-за того, что возможность добавили в приложение, не связав с разделом кода, взаимодействующего с DCOP. Подобные ошибки делают работу с DCOP немного непредсказуемой.

Используя Kdcop, вы можете дважды щелкнуть на setWallpaper, ввести путь к изображению и число 1 для режима и посмотреть как изменится рабочий стол. Удостоверившись, что это работает, можете попробовать версию из командной строки, составляя команду пути к функции. Вот что вам надо набрать, чтобы изменить фон рабочего стола из командной строки:

 dcop kdesktop KBackgroundIface setWallpaper image.jpg 1

Вам также следует предоставить полный путь к изображению: функция setWallpaper принимает расположение файла чисто как строку символов, и не воспринимает относительные пути.

Теперь у вас должно быть хорошее понимание того, как работает DCOP и что он умеет. А значит, теперь мы готовы сделать что-то более полезное, чем переключение фона рабочего стола.

Менеджер виртуального рабочего стола

Скорая помощь

Вы можете определить, какой рабочий стол использовать для запуска приложения с помощью инструмента Kstart. Например, kstart -desktop 3 konqueror запустит Konqueror на третьем рабочем столе.

Одна из возможностей, которых мне всегда не хватало в KDE – группировка приложений на одном виртуальном столе в соответствии с задачей, которую они выполняют. Я бы выделил виртуальный рабочий стол каждой задаче: например, один для KMail, другой – для Konqueror, а третий – для терминала. DCOP позволяет набросать скрипт для вашего собственного решения; это простая альтернатива исследованию исходного кода и ручного добавления новых возможностей – что-то типа быстрого прототипирования KDE-приложений. Надеюсь, некая форма инструмента управления виртуальным рабочим столом войдет в состав KDE 4, но покамест вы можете построить свое решение с помощью DCOP.

К несчастью, решение отнюдь не лежит на поверхности – одной DCOP-командой для переключения рабочего стола запущенного приложения тут не обойтись: команды, меняющей виртуальный рабочий стол приложения, в DCOP попросту нет. Об этом знают разработчики KDE, и хорошо бы такая команда появилась в KDE 4. Будем делать революцию с теми командами, какие у нас есть! А именно, спрячем приложение, которое мы хотим переместить на другой рабочий стол, и перейдем на требуемый стол, не восстанавливая приложения, а восстановим его до исходного размера на новом рабочем столе. Согласен, решение жутко неэффективное, но для того, кто будет смотреть на ваш экран, это будет круто, так как ваши окна будут перетасовываться автоматически.

DCOP-команды для свертывания и восстановления окна можно найти в списке функций верхнего уровня под заголовком имя_приложения-mainwindow#1. Рассматриваемые функции – это void hide() и void restore(). Чтобы проверить, что они работают так, как вы ожидаете, можете либо дважды нажать на них в Kdcop, либо попробовать составить командный эквивалент, выглядящий так:

dcop konqueror-5887 konqueror-mainwindow#1 ‘hide()’

Параметр hide() надо поместить внутри апострофов; в противном случае, Bash будет неправильно интерпретировать скобки и команда не выполнится.

Но прежде чем писать скрипт виртуального рабочего стола, надо решить еще одну проблему. Когда есть более одного экземпляра приложения (в данном случае Konqueror), то к имени приложения следует добавлять идентификатор процесса. Это немного усложняет предсказание имени приложения, которое будет использовано в нашем скрипте. Нужен способ добавления идентификатора процесса к имени KDE-приложения. Одно из решений состоит в том, чтобы вывести сразу все процессы Konqueror, употребив специальный символ *, например:

$ dcop konqueror*
konqueror-5887
konqueror-5870
konqueror-724

а затем использовать каждую строку вывода в качестве ввода для цикла for в вашем скрипте Bash. Однако есть лучшее решение, использующее другой инструмент DCOP, который присутствует на каждом рабочем столе KDE: dcopfind. Этот инструмент создан для поиска и возврата DCOP-возможностей DCOP-клиента – например, поиска приложений, которые поддерживают инъекцию URL. Но он рассчитан на обработку многих клиентов, и его побочный эффект – возможность использовать символы подстановки для одновременного обращения ко всем экземплярам приложения. Например, вот как спрятать все экземпляры Konqueror:

dcopfind ‘konqueror*’ ‘konqueror-mainwindow*’ ‘hide()’

Я нашел еще одну ошибку в KDE 3.5.6, когда каждый экземпляр не сворачивался, хотя и должен был. В данном случае мне пришлось выполнять эту команду дважды, чтобы свернуть все. Если у вас такая же проблема, попробуйте сделать то же самое.

Скорая помощь

Всегда начинайте с Kdcop, чтобы удостовериться, что функции DCOP работают так, как вы ожидаете. После этого можете создавать собственные скрипты.

Рис. 2

Некоторые DCOP-функции возвращают значения, и Kdcop отобразит эти значения в нижней панели. Здесь он возвращает номер текущего рабочего стола.


Теперь, когда все экземпляры Konqueror спрятаны, надо переключить рабочий стол на нужный, чтобы потом восстановить каждое приложение на новом экране. Для этого есть DCOP-команда для KWin, оконного менеджера KDE по умолчанию. Единственная проблема состоит в том, что если у вас альтернативный оконный менеджер, вроде предоставляемых Beryl и Compiz3D, вы не сможете использовать DCOP для переключения рабочих столов. Тогда вам придется найти другие команды. Но это может скоро измениться, так как идет активная разработка включения Beryl и Compiz в KWin.

dcop kwin KWinInterface setCurrentDesktop 3

Эта команда переключит текущий рабочий стол на третий. Остался последний шаг – восстановить все приложения на новом столе:

dcopfind ‘konqueror*’ ‘konqueror-mainwindow*’ ‘restore()’

В результате каждый ранее спрятанный экземпляр Konqueror появится на новом рабочем столе – то есть вы как будто перетащили все приложения Konqueror на один рабочий стол. Полностью скрипт будет выглядеть следующим образом:

#!/bin/bash
dcopfind ‘konqueror*’ ‘konqueror-mainwindow*’ ‘hide()’
dcopfind ‘konqueror*’ ‘konqueror-mainwindow*’ ‘hide()’
dcop kwin KWinInterface setCurrentDesktop 3
dcopfind ‘konqueror*’ ‘konqueror-mainwindow*’ ‘restore()’

Эти четыре строчки – только начало. В настоящий момент скрипт можно рассматривать как рабочий прототип и доказательство концепции; правда, пригодиться он может только при довольно редких обстоятельствах. Очевидно, его можно улучшить не одним способом. Но первым делом мы должны добавить поддержку всех используемых приложений. В моем случае это будут KMail, KDevelop и Kate, и каждое из них можно пристроить, видоизменив команду dcopfind. Например,

dcopfind ‘kmail*’ ‘kmail-mainwindow*’ ‘hide()

найдет и свернет главное приложение KMail. Если используется всего один экземпляр приложения, то, возможно, проще будет использовать обычную команду dcop – например, маловероятно, что KMail будет запущен более чем в одном экземпляре. Использование dcopfind тут не строго обязательно, но так лучше с точки зрения целостности.

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

Если вы работаете с большим количеством приложений KDE, то вам, возможно, следует использовать внешний файл настройки для хранения списка приложений, которыми вы хотите управлять, и рабочих столов, на которых вы хотите их видеть. Затем вам потребуется изменить скрипт, чтобы загружать в цикле каждую строку файла и обрабатывать имя приложения так же, как мы делали выше (свертывая и восстанавливая каждое приложение).

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

вряд ли очень полезно. Такую функциональность можно реализовать через возвращаемые значения функций DCOP. Это единственный способ узнать, который рабочий стол вы использовали перед переключением на другой. Полученное значение может использоваться перед выходом из скрипта для возврата на прежние позиции.

Вы могли заметить, что многие из функций DCOP начинаются со слова void. Обычно в этом месте указывается тип возвращаемого значения функции. Но когда программист использует слово ‘void’, это значит, что возвращаемое значение отсутствует, и функция просто отработает без какого-либо вывода. Функции, у которых вместо void проставлен тип, соответственно, возвращают значение данного типа. Например, значение функций, которые возвращают QStringList – несколько строк текста (программисты рассматривают текст как ‘строку’ символов), а значением функций, возвращающих int и float, будут соответственно целое число и число с плавающей точкой. Функция, определяющая номер используемого рабочего стола, возвращает целое значение. Она называется currentDesktop, и ее можно найти в иерархии под именем приложения KWinInterface в DCOP. Использование возвращаемых значений не составляет труда. Вот две строки, которые необходимы, чтобы сохранить значение начального рабочего стола в переменную DESKTOP, а потом переключиться назад по значению в DESKTOP:

DESKTOP=`dcop kwin KWinInterface currentDesktop`
dcop kwin KWinInterface setCurrentDesktop $DESKTOP

Первую строку надо поместить в начале скрипта, а вторую в конце. Теперь, запустив его, вы вернетесь на тот рабочий стол, откуда пришли, и как во всех хороших руководствах, конец – это только начало. В скрипте надо реализовать дополнительную проверку ошибок, чтобы убедиться, во-первых, что манипулируемые приложения действительно запущены, а во вторых, что столы действительно существуют. Обе этих функции добавить легко; сделайте это сразу после того, как заработает первоначальный скрипт.

Дерзайте!

У меня полным-полно идей по использованию DCOP, чтобы добавить функциональности KDE (см. «Клевые идеи для DCOP»), и если у вас чешутся руки протестировать другой DCOP-проект, почему бы и не попробовать? Это также будет идеальным введением в программирование KDE, поскольку по мере написания скриптов DCOP вы изучите множество внутренних механизмов KDE. Если вы реализовали одну из наших идей или сделали собственную версию переключения рабочих столов, дайте нам знать. Мы будем счастливы включить ваши творения на DVD грядущих выпусков. LXF

Клевые идеи для DCOP

Если вы хотите внедрить в жизнь новые навыки DCOP, почему бы не попробовать следующие идеи?

  • Одной из самых желанных возможностей в Kopete является функция «buddy pounce», чтобы Kopete автоматически посылал сообщение, когда собеседник выходит в сеть. Простой скрипт DCOP может выполнить эту задачу.
  • Последние версии Kopete отключают автоматическую проверку орфографии, пока вы общаетесь с кем-либо в чате. DCOP может автоматически включить ее снова.
  • В LXF79 была подробная статья о построении собственного Linux-киоска. DCOP является идеальным решением для блокирования рабочего стола вашего киоска, так как он даже может заставить переключиться Konqueror в полноэкранный режим киоска.
  • K3b имеет один из самых лучших DCOP-интерфейсов, и там есть все виды работы с дисками, которые можно автоматизировать с помощью DCOP. Как насчет прожига ISO в режиме drag&drop?

Шаг за шагом: Меняем обои на рабочем столе

Шаг 1

  • Запуск Kdcop Kdcop необходимо запускать либо из командной строки, либо набрав KDCOP в панели Run Command Основное окно покажет все запущенные KDE-приложения, а нажатие на каждом из них выведет список всех доступных функций.

Шаг 2

  • Выбор вашей функции Поле поиска отфильтрует список функций в реальном времени, и это лучший способ найти определенную функцию, не прибегая к ручному сканированию приложений. Функция, нужная для смены фона рабочего стола, называется setWallpaper.

Шаг 3

  • Добавление свойств Есть две функции setWallpaper. Вся разница между ними в том, что одна принимает два параметра, а другая три. Двойной щелчок по функции, и можно вводить требуемые данные – путь к изображению, рабочий стол, который вы хотите поменять, и режим масштабирования.
Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию