sK1 Project :: СПО решения для полиграфии

tkXcursor

Данный пакет является небольшим нативным расширением Python, позволяющим создавать кастомные ARGB/анимированные курсоры (Xcursor) в X.org сервере. Он может использоваться для все версий tcl/tk и Python 2.x.

На данный момент tcl/tk не предоставляет возможности устанавливать такие курсоры для tk виджетов. Есть возможность использовать только монохромные XBM (1-bit) кастомные курсоры. Но сервер X.org поддерживает ARGB/анимированные курсоры уже давно, с похожими свойствами как на MS Windows платформе. Поэтому мы разработали этот небольшой пакет, чтобы восполнить этот пробел.

Для небольших десктопных приложений этот пакет ценности особой не имеет, поскольку они могут использовать стандартные системные курсоры. Но для работы холста sK1 нам нужно было использовать большое количество кастомных курсоров, чтобы отражать состояние холста и режимы редактирования. XBM курсоры достаточно примитивны и несовместимы с win32 курсорам (по-крайней мере, требуют специальной конвертации в CUR формат). Вместе с тем, исходные png файлы могут быть сконвертированы как в Xcursor'ы так и в win32 курсоры без дополнительных манипуляций.

Следующая иллюстрация показывает разницу между типами курсоров:

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

Забавно, что среди крупных графических FOSS приложений, кастомные ARGB курсоры используются только в GIMP. Inkscape, Krita, Scribus и пр. используют старые XBM курсоры.

Как пользоваться tkXcursor
(небольшое руководство для Python программистов)

Пакет tkXcursor содержит только 3 функции:

is_xcursor_supported(any_widget)
load_cursor(any_widget, filename)
set_cursor(target_widget, cursor_id)

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

После загрузки Xcursor ресурсного файла, функция load_cursor() возвращает id курсора. На нативной стороне это XID (т.е. значение long) но в Python-коде нет смысла создавать специальный объект для XID. Поэтому id курсора это просто питонский integer, который можно использовать в set_cursor() функции где угодно и сколько угодно раз.

Последнее важное замечание связано с моментом установки курсора. В простых tk-приложениях все значения виджетов часто задаются до mainloop() инструкции. Для кастомных Xcursor'ов это неприемлимо. Вы можете загрузить курсор до mainloop() используя ссылку на root окно, потому что интерпретатор tk создает root окно сразу же. Но установка кастомного курсора должна выполняться только после первого <Visibility> события, когда целевой виджет будет действительно создан интерпретатором. Иначе вы получите ошибку Segmentation fault на нативной стороне и ваше приложение будет сразу же остановлено.

Как загрузит исходный код tkXcursor

Исходный код проекта можно загрузить следующей консольной командой:

svn checkout https://github.com/sk1project/tkxcursor tkXcursor

Также вы можете скачать архив среза SVN: http://sk1project.org/tarballs/tkXcursor-1.0.0.tar.gz

Обзор SVN репозитория tkXcursor