Красный курсор для русского языка

Когда-то Артём изобрёл отличный способ индикации текущей раскладки: красить текстовый курсор в тот или иной цвет.

Я пытался реализовать такую штуку под Виндоусом, но, насколько я понял, там текстовый курсор на уровне системы вообще не имеет цвета, то есть, чтобы это реализовать, пришлось бы, натурально, рисовать поверх настоящего курсора своё «окно» размером с палку курсора, и мигать этим окном, подстраиваясь под выбранную в системе частоту мигания курсором. Проще застрелиться, чем даже пытаться написать такое заведомо кривое и глючное приложение.

С тех пор, как я переехал на Мак, я не без удовольствия ковыряюсь в местных средствах разработки. Постепенно я научился: отслеживать момент смены раскладки клавиатуры; изменять цвет курсора в текстовом поле моей программы, определять текущее «ключевое» (т. е. отвечающее за обработку клавиатурных событий) окно приложения, определять текущую раскладку клавиатуры.

Оставалось только научиться встраиваться в чужие приложения и находить там текущий активный контрол. Я начитался документации и понял, что моей программе нужно стать инпутменеджером, то есть приложением, посредством которого производится текстовый ввод (это АПИ, видимо, сделано для организации всяких альтернативных способов ввода). Поскольку инпутменеджер — это, по сути, совершенно любой твой код, который выполняется от имени любого другого приложения (и, соответственно, с его правами), то это как бы опасная штука. Вроде как в Тигре даже был какой-то вирус, использовавший этот механизм, поэтому в Леопарде к инпутменеджерам стали предъявляться сверхстрогие требования.

С помощью интернета и Славы Карпенко я разобрался с тем, как сделать и установить инпутменеджером собственный бандл (connecting the dots!) и сделал пруф-оф-концептовый инпутменеджер, реализующий идею Артёма. Он далёк от совершенства:

  1. Работает только в Какао-приложениях (Мейл, Адрес-бук; Адиум, Скайп; системное меню Спотлайта...), но не работает в Карбон-приложениях (Айтюнс, Файндер, весь Адоби). С одной стороны, в Снежном барсе все родные приложения должны будут перейти на Какао. С другой, нельзя исключать, что поддержку инпутменеджеров прибьют.
  2. Работает только в стандартных текстовых полях. Например, в поле комментариев в браузере работать не станет. В поле написания письма в мейле тоже не заработает, так как там тоже используется какой-то контрол на базе WebView (потому что там можно писать ХТМЛ-письма и вставлять туда атачи).
  3. Использует таймер, чтобы не пропустить момент, когда человек переходит из одного текстового поля в другое (ловить activeConversationChanged:toNewConversation: у меня пока не получается).
  4. Не исключено, что он где-нибудь «течёт» (берёт память и не освобождает потом) — я не очень силён в таком хардкорном программировании, поэтому мог упустить что-то. Учитывая, что он выполняется в чужих приложениях, а не сам по себе, масштаб бедствия (если оно есть) существенно увеличивается. Ну, а если он течёт в том коде, который выполняется по таймеру, то всё вообще очень плохо.
  5. Он тупо красит курсор в красный цвет, если среди поддерживаемых текущей раскладкой языков не встречается английский, то есть никакой настройки раскладок/цветов нет.

Он называется Lipstick (LIP — это как бы Language Insertion Point, ну, или, Layout, или Locale). Чтобы установить его, нужно:

  1. Скачать архив.
  2. Создать в /Library/InputManagers (именно в корне!) папку Lipstick
  3. Кинуть туда оба файла (инфо и бандл) из архива.
  4. Сказать терминалу (ввести пароль при необходимости):
    sudo chown -R root:admin /Library/InputManagers
    sudo chmod -R 555 /Library/InputManagers

В каждом Какао-приложении он заработает после его перезапуска (перезапускать систему, по крайней мере, Леопард, не нужно). Спотлайт в правом верхнем углу можно перезапустить так:

killall Spotlight

Картинка:

Липстик в почте

Если какое-нибудь приложение начнёт тормозить или падать в неположенном месте, вполне может быть, что это из-за Липстика. Чтобы его выключить, просто уберите Lipstick из папки /Library/InputManagers и перезапустите соответствующее приложение.

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

Дальше
22 комментария
Андрей 2009

Для винды есть Aml Maple: http://www.amlpages.com/Rus/download.htm#amlmaple
Если отключить лишнюю фигню вроде обозначения языка и флажка, получится то, что искал. Иногда подглючивает — не меняет цвет или вместо одного моргания видно два, но в основном работает.

Илья Бирман 2009

Когда я её смотрел, она «умела» только мышиный курсор, что совершенно никому не нужно. А ещё там такой отвратительный сайт, что если бы не ваша ссылка с якорем, то я бы просто её не нашёл (не так давно я хотел посмотреть её снова, то ссылку у Артёма вела куда-то на  Aml Pages) :-)

clops 2009

Идея, конечно, прикольная; Вполне уверен, что она (программа) будет работать во всех приложениях и во всех полях ввода, ибо есть, например, AutoPairs (http://www.jwwalker.com/pages/autopairs.html) без которого я вообще уже давно не представляю успешной мак-жизни.

clops 2009

Перечитал свой комментарий и понял, что надо больше спать. Я к тому — что в Оси наверняка есть все необходимые точки входа, чтобы твоя прогга могла работать везде без исключения.

Илья Бирман 2009

Я уже смотрю твою прогу — пока не знаю, через что она работает, надо написать автору. Сейчас я делаю [textView setInsertionPointColor:] — это по определению может работать только в Какао. Я просто не уверен, что карбоновые текстовые умеют менять цвет курсора. Если умеют — буду думать, как это использовать.

Что касается полей типа WebView и подобных, то в открытых АПИ я не нашёл ничего похожего на setInsertionPoinColor:.

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

Андрей 2009

Про мышиный курсор в maple даже и не знал. Или дефолтом выключено и сработал ментальный фильтр от ненужных опций, или автоматом отключил :)

Вячеслав Ильинский 2009

В будущем будет возможность перекрашивать «палку курсор»?

Николай Товеровский 2009

Чёрт, не могу понять зачем эта штука нужна. Ну вот заметил я, что набираю не в той раскладке, и что? Нажал Pause Break (Punto Swithcer переключил в нужную) и продолжаю набирать, зачем цвет курсора?

Мазов Гоша 2009

1) Можно в Windows менять цвет курсора, и конечно же, безо всякого засранного собственного окна — еще чего не хватало есть. Но ессесна, делается это не документированными функциями Windows API, а достаточно низкоуровневым кодом, вовсю использующим возможности GDI. Конечно, это то самое «харкдорное» программирование и с памятью нужно обходиться аккуратно, т. к. начиная с W2K все объекты GDI это объекты kernel-mode уровня — будет течь в них, проблем и матюгов от пользователей не обобраться. Безусловно, код управления памятью в GDI не самый простой, но чуть-чуть головы и все получается. Но безо всякой гарантированной поддержки Виндой в будущих версиях. Но все-таки всё возможно, всего лишь ловкость рук и никакого мошенства.

2) Сайт уж какой есть, и справа вверху есть ба-а-а-альшая такая ссылка на Маплю.

3) Поддержка флагов и названий языков в мышином курсоре это изначальная возможность Мапли сделанная еще в самой первой версии 1.0. Кстати по умолчанию эта возможность включена, если конечно не пользоваться сторонними аддонами — они конфигурируют Маплю сами, еще до первого же запуска, и понятное дело могут отключать использование курсора. Просто имеет смысл почитать ReadMe — в нем всё описано.

Денис 2009

Но ессесна, делается это не документированными функциями Windows API, а достаточно низкоуровневым
кодом, вовсю использующим возможности GDI. Конечно, это то самое «харкдорное» программирование

Под низкоуровневым программированием вы подразумеваете внедрение длл-ки в чужой процесс и вызов функций (CreateCaret, ShowCaret) от имени чужого процесса?

П. С. Кстати, отображение каретки в ФаерФоксе глючит :(

Владимир Петров 2009

Виниловый падеж.

Дурак 2009

Привет всем!

На хабре один чувак посоветовал сделать так и получилось супик-пупик (прям по-дизайнерски).
Он написал, что по правому шифту у него включается русский, а по левому — английский. Считаю, что это круче красного курсора. Пунто требуется, конечно.

д

daniyar Basharov 2009

здорово

Андрей 2009

оффтопик: гмейл отправил все извещения о комментариях в спам :о)

Мазов Гоша 2009

1) 2Денис: можно и через CreateCaret, вариантов собственно много, и уж точно совсем не надо ничего трогать с ShowCaret. «Низкоуровневые» это только в контексте стартовой статьи, в том контексте что ничего не нужно мудрить с созданием окон заради таких мелочей. (в общем, всё относительно :)

2) Про Firefox подробно писал на ОсЗоне (http://forum.oszone.net/post-1116503.html#post1116503)

Павел Малинников 2009

Вы меня так заинтриговали своим курсором, что я даже сделал прототип, который при помощи каретки сигнализирует о текущей раскладке. Только не цветом, а частотой мигания. Быстро мигает — русский, медленно — английский.

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

Посмотреть можно здесь

daniyar Basharov 2009

повесило систему, снес

Павел Малинников 2009

какая система?

daniyar Basharov 2009

mac os X LEO 10.5.6

Павел Малинников 2009

2 #17 daniyar Basharov

помилуйте, сударь. Это для виндовс.

Мазов Гоша 2009

2Павел Малинников
Что ж приятно поинтриговать пользователей! А с частотой мигания интересная мысля — как насчет легкого (но нескорого) клона в Мапле 2.30? Только есть идеи чуть иначе воспринимать частоту мерцания...
А почему Вы думаете что много приложений игнорят частоту мерцания?

Павел Малинников 2009

2 #19 Мазов Гоша

Меня заинтриговали не только вы, но и Илья своей заметкой :-)

Насчёт того, чтобы использовать идею передачи инфы частотой мерцания — пожалуйста, используйте. Если упомянете меня по этому поводу, мне будет приятно :-)

Некоторые ява-приложения и браузеры игнорируют системную частоту мерцания, я здесь написал об этом:
http://malinnikov.ru/karetka-kak-indikator-tekushhej-raskladki/

Мазов Гоша 2009

2Павел: конечно же, с удовольствием упомяну — красивая идея!

Сергей 2009

У меня не работает. Система 10.5.7.

Мои книги