Одной из самых продвинутых сред рабочего стола вообще, и по-моему мнению лучшей для настольной машины под Linux(почему для именно для настольной — см. нынешнее состояние Gnome 3).
Не в последнюю очередь это обусловлено это тем, что у KDE помимо единого целостного API(+ никто не запрещает пользоваться Qt в чистом виде), у пользователя всегда есть возможность автоматизировать часть рутинной работы.
Подобная задача возникла и у меня — нужно было иметь возможность получать содержимое буфера обмена, пробегать по нему парой регулярок, и опять сохранить результат в буфер.
Стоит сразу сказать, что речь не идет о использовании python скриптов или c++ — об этом позже.
Содержимым буфера обмена удобнее всего управлять при помощи утилиты Klipper.Вообще это довольно мощная утилита, среди фич которой стоит выделить :
- возможность редактирования содержимого буфера обмена
- возможность работы с историей буфера обмена, причем почти произвольного размера
- синхронизация содержимого выделением (то есть можно просто выделить мышью некий текст и он тут же скопируется в буфер)
- самое вкусное, что превращает буфер обмена в нечто суровое и мощное — это возможность натравить какое-то действие на соответствие какому-то регулярному выражению строку. Сложно написал, надеюсь скриншот пояснит :
Применений этому можно найти массу : так например, можно при копировании в буфер определенного доменного именни можно вызвать утилиту dig, получать от нее вывод, обработать c помощью sed/awk и получить список IP-адресов, связанных с этим именем.
Подробнее эта возможность рассмотрена на Хабре
Так что будем рулить буфером обмена klipper, не трогая сам klipper мышкой, из консоли.
А для этого нам понадобится D-Bus.Вообще D-Bus можно посвятить целую серию постов, однако пост и так выходит большим, поэтому ограничюсь цитатой из русской Википедии :
D-Bus — система межпроцессного взаимодействия, которая позволяет приложениям в операционной системе общаться друг с другом…
D-Bus предоставляет системе несколько шин:
- Системная шина. Создаётся при старте демона D-Bus. С её помощью происходит общение различных демонов, она практически недоступна для пользовательских приложений
- Сессионная шина. Создаётся для пользователя, авторизировавшегося в системе. Для каждой такой шины запускается отдельная копия демона, посредством неё будут общаться приложения, с которыми работает пользователь.
Каждое сообщение D-Bus, передаваемое по шине, имеет своего отправителя и своего получателя, их адреса называются путями объектов, поскольку D-Bus предполагает, что каждое приложение состоит из набора объектов, а сообщения пересылаются не между приложениями, а между объектами этих самых приложений.
Каждый объект может поддерживать один или более интерфейсов, которые представлены здесь в виде именованных групп методов и сигналов…
D-Bus также предусматривает концепцию сервисов. Сервис — уникальное местоположение приложения на шине. При запуске приложение регистрирует один или несколько сервисов, которыми оно будет владеть до тех пор, пока самостоятельно не освободит, до этого момента никакое другое приложение, претендующее на тот же сервис, занять его не сможет.
Сервисы делают доступной ещё одну функцию — запуск необходимых приложений в случае поступления сообщений для них. Для этого должна быть включена автоактивация, а в конфигурации D-Bus за этим сервисом должно быть закреплено одно приложение. Тогда D-Bus сможет его запустить при появлении сообщения
Подробно о D-Bus можно узнать здесь.Возможно позже сделаю ряд постов поглубже о этой технологии, а пока вставлю сюда общую схему работы :
Для работы с D-Bus существует целый ряд утилит, главная из которых — консольная dbus, или её реализация для KDE — qdbus.
Из man страницы узнаем общий синтаксис утилиты qdbus :
qdbus [--system] [--literal] [servicename] [path] [method] [args]
Рассмотрим аргументы запуска :
- —system — подключение к системной шине
- —literal — вывод в литеральном виде
Рассмотрим параметры
- servicename — имя сервиса, реализуемого приложением
- path — путь к сервису в UNIX — формате, корень — «/«
- method — вызов метода данного сервиса
- args — аргументы вызова метода
Вообщем похоже на обычную работу с классами в современных языках программирования , только здесь у нас вместо классов — интерфейсы, имеющие методы и свойства (поля).В этом то и есть одна из целей проекта D-Bus.
Список всех доступных сервисов можно получить, вызвав утилиту без параметров.При помощи grep можно легко выяснить что среди таковых есть и сервис
teddy@teddy-System-Product-Name:~$ qdbus | grep klipper -> org.kde.klipper
Забегая вперёд скажу, что в данном случае корень для параметра path будет «org.kde» в имени сервиса. То есть для того чтобы составить правильно путь к сервису klipper, нужно заменить «org.kde.klipper» на «/klipper» . Пользуемся клавишей Tab чтобы узнать, чтомы можем сделать с этим интерфейсом :
Видим список методов и свойств этого интерфейса.Сразу бросаются в глаза три группы :
- с префиксом org.freedesktop.Dbus — методы, реализующие непосредственно D-Bus.О них — отдельный разговор, ибо это сердце этой технологии (интроспекция, маршаллинг и прочее)
- с префиксом org.kde.klipper.klipper — легко догадаться это и есть нужные методы klipper’а
- QString/QVariantMap/Q* — структуры данных Qt, ибо под капотом у KDE — Qt.
Видим метод
org.kde.klipper.klipper.getClipboardContents
Который как-бэ намекает своим названием, что должен на вернуть содержимое буфера обмена.Проверим :
Так оно и есть.Мы получили строку (QString) с содержимым вершины стека буфера обмена(если у нас клиппер настроен на сохранение истории буфера обмена) или просто содержимым этого буфера обмена.
Если нам нужен не последний элемент буфера в истории, то берем в руки метод
org.kde.klipper.klipper.getClipboardHistoryItem
Передаем ему номер элемента от вершины стека истории (то есть последний скопированный элемент будет иметь индекс 0 и находиться на вершине стека)
Очистить буфер обмена можно используя методы :
org.kde.klipper.klipper.clearClipboardHistory org.kde.klipper.klipper.clearClipboardContents
Наконец, для того чтобы записать в вершину стека истории буфера обмена, можно использовать метод :
org.kde.klipper.klipper.setClipboardContents
Проверим :
Остальные методы связанна с кастомными действиями над содержимым буфера, вызовом меню и прочим.
Вот таким простым способом можно манипулировать буфером обмена KDE.Учитывая, что биндиги к D-Bus есть как в Qt, так и в виде модуля для Python, применений этой штуке можно найти массу, все ограниченно лишь Вашей фантазией.
Ссылки :





