Красный курсор для русского языка
Когда-то Артём изобрёл отличный способ индикации текущей раскладки: красить текстовый курсор в тот или иной цвет.
Я пытался реализовать такую штуку под Виндоусом, но, насколько я понял, там текстовый курсор на уровне системы вообще не имеет цвета, то есть, чтобы это реализовать, пришлось бы, натурально, рисовать поверх настоящего курсора своё «окно» размером с палку курсора, и мигать этим окном, подстраиваясь под выбранную в системе частоту мигания курсором. Проще застрелиться, чем даже пытаться написать такое заведомо кривое и глючное приложение.
С тех пор, как я переехал на Мак, я не без удовольствия ковыряюсь в местных средствах разработки. Постепенно я научился: отслеживать момент смены раскладки клавиатуры; изменять цвет курсора в текстовом поле моей программы, определять текущее «ключевое» (т. е. отвечающее за обработку клавиатурных событий) окно приложения, определять текущую раскладку клавиатуры.
Оставалось только научиться встраиваться в чужие приложения и находить там текущий активный контрол. Я начитался документации и понял, что моей программе нужно стать инпутменеджером, то есть приложением, посредством которого производится текстовый ввод (это АПИ, видимо, сделано для организации всяких альтернативных способов ввода). Поскольку инпутменеджер — это, по сути, совершенно любой твой код, который выполняется от имени любого другого приложения (и, соответственно, с его правами), то это как бы опасная штука. Вроде как в Тигре даже был какой-то вирус, использовавший этот механизм, поэтому в Леопарде к инпутменеджерам стали предъявляться сверхстрогие требования.
С помощью интернета и Славы Карпенко я разобрался с тем, как сделать и установить инпутменеджером собственный бандл (connecting the dots!) и сделал пруф-оф-концептовый инпутменеджер, реализующий идею Артёма. Он далёк от совершенства:
- Работает только в Какао-приложениях (Мейл, Адрес-бук; Адиум, Скайп; системное меню Спотлайта...), но не работает в Карбон-приложениях (Айтюнс, Файндер, весь Адоби). С одной стороны, в Снежном барсе все родные приложения должны будут перейти на Какао. С другой, нельзя исключать, что поддержку инпутменеджеров прибьют.
- Работает только в стандартных текстовых полях. Например, в поле комментариев в браузере работать не станет. В поле написания письма в мейле тоже не заработает, так как там тоже используется какой-то контрол на базе WebView (потому что там можно писать ХТМЛ-письма и вставлять туда атачи).
- Использует таймер, чтобы не пропустить момент, когда человек переходит из одного текстового поля в другое (ловить activeConversationChanged:toNewConversation: у меня пока не получается).
- Не исключено, что он где-нибудь «течёт» (берёт память и не освобождает потом) — я не очень силён в таком хардкорном программировании, поэтому мог упустить что-то. Учитывая, что он выполняется в чужих приложениях, а не сам по себе, масштаб бедствия (если оно есть) существенно увеличивается. Ну, а если он течёт в том коде, который выполняется по таймеру, то всё вообще очень плохо.
- Он тупо красит курсор в красный цвет, если среди поддерживаемых текущей раскладкой языков не встречается английский, то есть никакой настройки раскладок/цветов нет.
Он называется Lipstick (LIP — это как бы Language Insertion Point, ну, или, Layout, или Locale). Чтобы установить его, нужно:
- Скачать архив.
- Создать в /Library/InputManagers (именно в корне!) папку Lipstick
- Кинуть туда оба файла (инфо и бандл) из архива.
- Сказать терминалу (ввести пароль при необходимости):
sudo chown -R root:admin /Library/InputManagers
sudo chmod -R 555 /Library/InputManagers
В каждом Какао-приложении он заработает после его перезапуска (перезапускать систему, по крайней мере, Леопард, не нужно). Спотлайт в правом верхнем углу можно перезапустить так:
killall Spotlight
Картинка:
Если какое-нибудь приложение начнёт тормозить или падать в неположенном месте, вполне может быть, что это из-за Липстика. Чтобы его выключить, просто уберите Lipstick из папки /Library/InputManagers и перезапустите соответствующее приложение.
Всё, что вы делаете, вы делаете на свой страх и риск, за возможный взрыв вашего компьютера я не несу ответственности. Но — с интересом послушаю ваш рассказ об этом.
Для винды есть Aml Maple: http://www.amlpages.com/Rus/download.htm#amlmaple
Если отключить лишнюю фигню вроде обозначения языка и флажка, получится то, что искал. Иногда подглючивает — не меняет цвет или вместо одного моргания видно два, но в основном работает.
Когда я её смотрел, она «умела» только мышиный курсор, что совершенно никому не нужно. А ещё там такой отвратительный сайт, что если бы не ваша ссылка с якорем, то я бы просто её не нашёл (не так давно я хотел посмотреть её снова, то ссылку у Артёма вела куда-то на Aml Pages) :-)
Идея, конечно, прикольная; Вполне уверен, что она (программа) будет работать во всех приложениях и во всех полях ввода, ибо есть, например, AutoPairs (http://www.jwwalker.com/pages/autopairs.html) без которого я вообще уже давно не представляю успешной мак-жизни.
Перечитал свой комментарий и понял, что надо больше спать. Я к тому — что в Оси наверняка есть все необходимые точки входа, чтобы твоя прогга могла работать везде без исключения.
Я уже смотрю твою прогу — пока не знаю, через что она работает, надо написать автору. Сейчас я делаю [textView setInsertionPointColor:] — это по определению может работать только в Какао. Я просто не уверен, что карбоновые текстовые умеют менять цвет курсора. Если умеют — буду думать, как это использовать.
Что касается полей типа WebView и подобных, то в открытых АПИ я не нашёл ничего похожего на setInsertionPoinColor:.
Если твоя прога работает через Accessibility API, то тогда мне это не подходит — там нет ничего про цвет курсора и нет возможности слать объектам селекторы по своему вкусу.
Про мышиный курсор в maple даже и не знал. Или дефолтом выключено и сработал ментальный фильтр от ненужных опций, или автоматом отключил :)
В будущем будет возможность перекрашивать «палку курсор»?
Чёрт, не могу понять зачем эта штука нужна. Ну вот заметил я, что набираю не в той раскладке, и что? Нажал Pause Break (Punto Swithcer переключил в нужную) и продолжаю набирать, зачем цвет курсора?
1) Можно в Windows менять цвет курсора, и конечно же, безо всякого засранного собственного окна — еще чего не хватало есть. Но ессесна, делается это не документированными функциями Windows API, а достаточно низкоуровневым кодом, вовсю использующим возможности GDI. Конечно, это то самое «харкдорное» программирование и с памятью нужно обходиться аккуратно, т. к. начиная с W2K все объекты GDI это объекты kernel-mode уровня — будет течь в них, проблем и матюгов от пользователей не обобраться. Безусловно, код управления памятью в GDI не самый простой, но чуть-чуть головы и все получается. Но безо всякой гарантированной поддержки Виндой в будущих версиях. Но все-таки всё возможно, всего лишь ловкость рук и никакого мошенства.
2) Сайт уж какой есть, и справа вверху есть ба-а-а-альшая такая ссылка на Маплю.
3) Поддержка флагов и названий языков в мышином курсоре это изначальная возможность Мапли сделанная еще в самой первой версии 1.0. Кстати по умолчанию эта возможность включена, если конечно не пользоваться сторонними аддонами — они конфигурируют Маплю сами, еще до первого же запуска, и понятное дело могут отключать использование курсора. Просто имеет смысл почитать ReadMe — в нем всё описано.
Под низкоуровневым программированием вы подразумеваете внедрение длл-ки в чужой процесс и вызов функций (CreateCaret, ShowCaret) от имени чужого процесса?
П. С. Кстати, отображение каретки в ФаерФоксе глючит :(
Виниловый падеж.
Привет всем!
На хабре один чувак посоветовал сделать так и получилось супик-пупик (прям по-дизайнерски).
Он написал, что по правому шифту у него включается русский, а по левому — английский. Считаю, что это круче красного курсора. Пунто требуется, конечно.
д
здорово
оффтопик: гмейл отправил все извещения о комментариях в спам :о)
1) 2Денис: можно и через CreateCaret, вариантов собственно много, и уж точно совсем не надо ничего трогать с ShowCaret. «Низкоуровневые» это только в контексте стартовой статьи, в том контексте что ничего не нужно мудрить с созданием окон заради таких мелочей. (в общем, всё относительно :)
2) Про Firefox подробно писал на ОсЗоне (http://forum.oszone.net/post-1116503.html#post1116503)
Вы меня так заинтриговали своим курсором, что я даже сделал прототип, который при помощи каретки сигнализирует о текущей раскладке. Только не цветом, а частотой мигания. Быстро мигает — русский, медленно — английский.
Конечно, много приложений игнорируют настроенную в системе частоту мерцания каретки, но должен ведь я был попробовать реализовать это :-)
Посмотреть можно здесь
повесило систему, снес
какая система?
mac os X LEO 10.5.6
2 #17 daniyar Basharov
помилуйте, сударь. Это для виндовс.
2Павел Малинников
Что ж приятно поинтриговать пользователей! А с частотой мигания интересная мысля — как насчет легкого (но нескорого) клона в Мапле 2.30? Только есть идеи чуть иначе воспринимать частоту мерцания...
А почему Вы думаете что много приложений игнорят частоту мерцания?
2 #19 Мазов Гоша
Меня заинтриговали не только вы, но и Илья своей заметкой :-)
Насчёт того, чтобы использовать идею передачи инфы частотой мерцания — пожалуйста, используйте. Если упомянете меня по этому поводу, мне будет приятно :-)
Некоторые ява-приложения и браузеры игнорируют системную частоту мерцания, я здесь написал об этом:
http://malinnikov.ru/karetka-kak-indikator-tekushhej-raskladki/
2Павел: конечно же, с удовольствием упомяну — красивая идея!
У меня не работает. Система 10.5.7.