Большой курсор в X11

Введение

Существует несколько причин, по которым стандартный курсор X11 может быть маловат:

когда X запущен на портативном компьютере с жидкокристаллическим дисплеем (LCD) с низким контрастом;

на нормальных дисплеях с большим разрешением (например 1600x1280);

для человека с плохим зрением даже на нормальном оборудовании.

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

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

Впрочем, кое-что можно сделать:

Существует набор стандартных курсоров мыши, которые находятся в шрифте "cursor" (вы можете посмотреть их командой "xfd -fn cursor"). Большинство программ используют именно эти курсоры, и ключевой идеей является замена стандартного шрифта "cursor" на увеличенную версию.

Об этом документе

Причиной написания этого мини-HOWTO послужила просьба моего однокурсника с плохим зрением, который спросил меня о том, как увеличить курсор мыши под X. После того, как я нашел способ это сделать, я написал первую версию данного документа. Информация об этом методе не является общей, но тем не менее я решился поместить его в Linux мини-HOWTO, даже несмотря на тот факт, что он совсем не специфичен для Linux. Как и другие мини-HOWTO, он находится в http://sunsite.unc.edu/LDP/HOWTO/.

Основная версия этого документа поддерживается в формате SGML/linuxdoc. Это позволяет автоматически получать версии в других форматах (которые можно найти там же): html, text, LaTeX, DVI, PostScript, GNU info.

Shinobu Miyata перевел этот текст на Японский http://i11www.ira.uka.de/~schneid/jp/X11-big-cursor/.

Как это сделать

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

берем файл cursor.bdf (исходный текст шрифта "cursor") из какого-нибудь дистрибутива X, например ftp://ftp.x.org/pub/R6.3/xc/fonts/bdf/misc/cursor.bdf (если вы его там не найдете, попробуйте поискать его в сети или возьмите мою копию).

берем, компилируем и инсталлируем пакет bdfresize ftp://ftp.cs.titech.ac.jp/X11/contrib/Local/bdfresize-1.4.tar.Z (или моя копия): zcat bdfresize-1.4.tar.Z | tar xf - cd bdfresize-1.4 xmkmf make На Linux вы, наверно, должны сделать: make CCOPTIONS='-include /usr/include/bsd/bsd.h' clean all

создаем каталог и записываем в него увеличенный шрифт (например в два раза): mkdir $HOME/fonts bdfresize -f 2 cursor.bdf | bdftopcf >$HOME/fonts/cursor2.pcf mkfontdir $HOME/fonts Я подготовил несколько шрифтов с увеличением в 1.5, 2, 2.5, 3, 4, 5, 6, 7, 8 и 16 раз. Если вы не хотите пользоваться bdfresize, можете найти их и поместить в каталог $HOME/fonts.

изменяем файлы .xinitrc или .xsession: перед тем как запустится X-клиент (который использует курсор), должны запускаться следующие команды: xset +fp $HOME/fonts xsetroot -cursor_name X_cursor

перезапустите X-сервер.

Это все. Теперь все курсоры мыши должны быть в два раза больше.

Замечания и ограничения

X-сервер может ограничивать максимальный размер курсора, особенно если курсор реализуется аппаратно. Другие X-сервера не имеют таких ограничению. Например, XF86_S3 3.3 работает с курсором 512x512 (правда очень медленно).

Увеличенный шрифт должен иметь то же название, что и оригинал. (имя шрифта должно быть cursor, имя файла не имеет значение); это не проблема, так как bdfresize не меняет имя шрифта.

В списке каталогов шрифтов каталог с новым шрифтом должен быть помешен выше каталога со стандартным шрифтом; это выполняет команда xset +fp (в отличие от xset fp+).

Любые изменения в каталоге $HOME/fonts/ вступают в силу после команд mkfontdir $HOME/fonts; xset fp rehash и перезапуска X-клиентов (а точнее, для вновь созданных курсоров).

xset +fp path может не работать на X-терминале, если он использует сервер шрифтов (см. раздел Сервер шрифтов) или другой способ управления шрифтами (это может исправить только ваш системный администратор).

Этот же способ можно использовать для olcursor и decw$cursor, и других шрифтов с курсорами мыши, которые вам могут встретиться.

Курсорные шрифты, созданные bdfresize, выглядят не очень гладкими, особенно при большом увеличении. Было бы не плохо, если бы кто-нибудь нарисовал свои крупные курсоры.

Технические рассуждения

Возможно ли написать программу, автоматически увеличивающую указатели?

Решение 1 (частичное)

Использовать XTestCompareCursor из XTEST. Для всех окон, над которыми движется указатель мыши курсор окна сравнивается с набором "известных" курсоров (например, из шрифта cursor). Если найден похожий курсор, то он заменяется на увеличенную версию. В противном случае, он остается без изменения или подставляется стандартный курсор. Это работает в том случае, если у вас есть XTest.

Решение 2

Написать X-прокси-сервер, передающий все запросы на X-сервер, за исключением запросов соответствующих функции XCreate*Cursor из библиотеки Xlib. Курсоры, определенные в запросах XCreate*Cursor должны изменяться на соответствующие увеличенные.

Прокси-сервер имитирует новый дисплей, например :1. Все клиенты, использующие этот дисплей (например xterm -display :1) показываются на обычном X-сервере :0), но их курсоры автоматически увеличиваются. Курсоры клиентов, использующих :0 не изменяются.

Другие идеи, позволяющие сделать курсор более заметным

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

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

Использовать XRecolorCursor для смены цвета курсора каждую 0.1 секунды.

Более ожидаемое решение - это мышиный хвост а-ля windows, т.е. при движении мыши, курсор рисуется на новом месте, а на старом месте стирается только через некоторую задержку. Мышиный хвост лучше всего реализовать в X-сервере, но проще все его сделать как X-клиент, а еще лучше как прокси-сервер (см. "Технические рассуждения").

Дополнительная информация

Сервер шрифтов

Сервер шрифтов - это сетевой сервис с простым протоколом, предоставляющий X11 набор шрифтов. Он предоставляет как список шрифтов, так и изображение.

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

Этот способ особенно удобен, если несколько машин не используют общую файловую системы или если вы пользуетесь X-терминалами.

Сам сервер шрифтов и утилиты, связанные с ним, идут с дистрибутивом X11R5+ (AFAIK).

Установка сервера шрифтов

Прочитайте руководства fs(1), fslsfonts(1) (или xfs(1), xfslsfonts(1) и попробуйте - это не сложно. Скажем, если вы запустили сервер шрифтов на машине some.host.edu на порту 7100. Вы можете проверить, как он работает командой

fslsfonts -server some.host.edu:7100

И настроить X-сервер командой

xset +fp tcp/some.host.edu:7100,

которая должна выполниться без ошибок.

Как достать bdf-файлы для некоторых шрифтов

Если у вас установлен сервер шрифтов, то используйте команду fstobdf, идущую вместе с сервером.

Кроме того, вы можете попробовать команду getbdf, которая записывает любой установленный в X11 шрифт в bdf файл.