LINUX.ORG.RU

Анонс: rainbow-cm — легковесный менеджер буфера обмена

 , ,


0

1

Приветствую!

До 2015-го года я использовал Parcellite, который в целом работал, но время от времени зависал, глючил и крашился. На тот момент были другие альтернативы, но они либо были привязаны к DE (например, clipman из xfce), либо имели свои собственные глюки, не лучше чем глюки в Parcellite.

В 2015-м я решил пофиксить код Parcellite и навсегда закрыть для себя вопрос с менеджером буфера обмена. Изучение кода показало его крайне низкое качество, так что фиксы вылились в то, что программа была почти полностью переписана.

Около пяти лет я пользовался программой, но не сделал официального релиза. На моем компьютере она просто работает без нареканий и багов. Думаю, надо выпустить её в свет.

Итак, что было сделано:

  • Около половины исходного кода было удалено.
  • Оставшаяся часть кода была в значительной мере переписана. (Но еще не полностью. Во многом оставшийся код всё еще походит на лапшу.)
  • Удалены все функции и фичи не имеющие прямого отношения к управлению буфером обмена, такие как поддержка запуска произвольных команд хоткеями. А также просто мусорные опции, такие как смена иконки приложения через конфиг.
  • Удалены все функции и фичи, которые были недоделаны или надежная реализация которых невозможна в рамках существующего оконного стека X11. (Например, попытка делать операцию Paste в произвольное приложение, при том что под X11 не существует никакого API для этого.)
  • Полностью переписана логика слежения за буфером обмена, теперь она не зацикливается, не приводит к невозможности работы некоторых других приложений и не жрёт процессор по таймеру.

Функции и возможности программы:

  • Для сборки и работы приложения требуется только X11 и gtk2, что обеспечивает совместимость с максимально широким рядом операционных систем и дистрибутивов.
  • Программа разрабатывается как часть проекта https://github.com/sde-gui/ , но не содержит никаких зависимостей от него.
  • Приложение отображает иконку в трее через стандартный X11-совместимый API. (Также в целях максимальной совместимости )
  • Вызов истории буфера обмена: ЛКМ по иконке в трее или нажатие Mod4 + Insert. (Хоткей можно сменить в настройках.)
  • Вызов меню для управления приложением: ПКМ по иконке в трее или нажатие Ctrl + Mod4 + Insert. (Хоткей можно сменить в настройках.)
  • Выбор пункта истории буфера обмена приводит к помещению его в буфер обмена, но без попытки сделать Paste. Paste в разных тулкитах и программах реализуется собственными средствами, так что для вставки вам нужно обычным образом нажать Ctrl+V, Shift+Insert или другой хоткей, в зависимости от конкретного приложения.
  • Слежение за буфером обмена и/или за буфером выделения, на усмотрение пользователя.
  • Возможность синхронизации буфера обмена и буфера выделения.
  • Быстрое включение/отключение программы через меню по ПКМ (на случай если нужно копировать конфиденциальные данные и т.п.).
  • Мгновенный поиск по истории буфера обмена: при открытом меню истории начинайте вводить текст, и приложение отфильтрует элементы. Поддерживается совместимость со стандартным переключением раскладок X11. С альтернативынмии методами ввода работоспособность еще не тестирорвалась.
  • Возможность закреплять элементы в истории. (При открытом меню истории: ПКМ по пункту меню -> откроется дополнительное меню -> Прикрепить)

Известные на данный момент баги и недоработки:

  • Невозможно одновременно открыть окно настроек и окно About. FIXED 2020-03-02
  • Попытка хоткеем вызвать меню истории буфера обмена при открытом окне настроек приводит к зависанию программы. FIXED 2020-03-02
  • Иконка приложения осталась от Parcellite, требует замены.
  • Редизайн окна настроек не завершен, требует доработки. FIXED 2020-03-01
  • Русская локализация выполнена не полностью, также в ней не назначены мнемоники контроллов в окне настроек.
  • Отсутствует документация.

Планируемое развитие программы:

  • Продолжение чистки кода.
  • Поддержка сохранения в истории буфера обмена изображений и текста с форматированием, а не только плейнтекста.

Чего не будет:

  • Перехода на другой тулкит, такой gtk3 или gtk4.
  • Привязки к непортабельным или привязанным к конкретному дистрибутиву API.
  • Bells and whistles.

Ссылки:

Ожидаемый фидбек:

  • Багрепорты относительно сборки и работы программы.
  • Локализация на другие языки, если найдутся желающие.
Deleted

Ответ на: комментарий от Deleted

Странно что синхронизация буферов обмена доступна только если включен параметр Отслеживать историю выделенного текста

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

Как сделать чтобы Синхронизация буфера консоли и буфера X11 была, но история не велась?

irton ★★★★★ ()
Ответ на: комментарий от Im_not_a_robot

попробуй скопировать текст в браузере, закрыть браузер, и вставить в терминал. если у тебя wm или de без clipboard manager’a, то скорее всего у тебя просто буффер очиститься.

anonymous ()
Ответ на: комментарий от anonymous

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

Im_not_a_robot ★★★★★ ()
Ответ на: комментарий от irton

Странно что синхронизация буферов обмена доступна только если включен параметр Отслеживать историю выделенного текста

Да, надо сделать две отдельные настройки.

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

Он относится ко всему, что выделяется мышкой или с клавиатуры. Так иксы устроены.

Как сделать чтобы Синхронизация буфера консоли и буфера X11 была, но история не велась?

С буфером VT программа никак не работает.

Deleted ()
Ответ на: комментарий от gedisdone

А буфер обмена может существовать без менеджера?

Буфер обмена существует, пока какое-нибудь приложение заявляет «у меня есть данные для буфера обмена». Когда такое приложение закрывается, буфер пропадает вместе с приложением.

Соответственно, нужна вспомогательная программа, которая будет хранить буфер, когда приложение закрылось.

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

Вторая функция менеджера — хранить историю буфера обмена. В винде такой фичи нет, но в MS Office что-то подобное ставилось каким-то расширением, плюс есть несколько бесплатных аналогичных утилит.

Deleted ()
Ответ на: комментарий от Deleted

Буфер обмена существует, пока какое-нибудь приложение заявляет «у меня есть данные для буфера обмена».

А как другая программа узнаёт, что «у первой есть данные для буфера обмена»?

gedisdone ★★★ ()
Ответ на: комментарий от gedisdone

А как другая программа узнаёт, что «у первой есть данные для буфера обмена»?

Через механизм IPC в X11, который называется Selections.

Когда вы нажимаете Ctrl+C, чтобы скопировать текст (или что угодно другое), приложение объявляет себя владельцем CLIPBOARD selection.

Когда в другом окне вы нажимаете Ctrl+V, чтобы вставить данные, второе приложение смотрит, кто является текущим владельцем CLIPBOARD selection и отправляет владельцу запрос на получение списка MIME-типов, в которых можно представить содержимое буфера обмена.

Если хотя бы один из MIME-типов понятен второму приложению, то оно знает, как «вставлять» такие данные. Оно посылает запрос на получение данных в указанном MIME-формате и затем вставляет их в документ.

Deleted ()
1.
./autogen.sh && ./configure && make -j1
-->
preferences.c: In function ‘bind_keys’:
preferences.c:402:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
  for (int i = 0; keylist[i].name; i++)
  ^

2.
export CFLAGS+=-std=c99
-->
keybinder.c:41:2: error: unknown type name ‘uint’
  uint                  keycode;
  ^
keybinder.c:42:2: error: unknown type name ‘uint’
  uint                  modifiers;
  ^

slackware 14.1x32

sunjob ★★ ()
Последнее исправление: sunjob (всего исправлений: 1)

в код посмотрел:

if(NULL == p) return -1;

скажите откуда такая манера переворачивать сравнение? естественней и читабельней смотрится p == NULL.

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

alysnix ()
Ответ на: комментарий от alysnix

скажите откуда такая манера переворачивать сравнение? естественней и читабельней смотрится p == NULL.

Согласно легендам, так меньше вероятность допустить ошибку в выражении. Я сам так никогда не делаю. Все части, где const == something – еще от прошлого автора.

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

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

Так даже мой самописный компилятор простого процедурного языка умеет.)

Deleted ()
Ответ на: комментарий от Deleted

Думаю, это еще с того времени, когда компиляторы такой варнинг не выдавали.

С этим надо бороться! …наконец я понял откуда эта дурь. возможно и правда чтобы не путалось с присваиванием.

alysnix ()