Как переназначить кнопку dictation на macOS (без стороннего софта)

от автора

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

Немного предистории

Год назад я купил Mac с функциональными клавишами и столкнулся с кнопкой dictation, которая вызывает стандартную программу для диктовки текста. Перед покупкой я предположил что это кнопка с значком микрофона должна включать и выключать микрофон, каково же было мое разочарование, когда вместо функционала включения и выключения микрофона я получил запуск dictation. Меня это не устроило и я начал поиски.

Первой программой, которую я нагулил, была Karabiner-Elements. Но она показалась мне слишком громоздкой для такой небольшой задачи.

Далее я нашел Ukelele, которая позволяет создать свою раскладку клавиатуру. Уже лучше, более нативно, но это все еще не то что нужно.

Потом я наткнулся на статью. В ней довольно подробно описывается как переназначить клавиши через утилиту hidutil встроенную в MacOS.

Тут появилась идея переназначить клавишу dictation на клавишу, которая не используется на клавиатуре, но поддерживается системой. Т.е. переназначить код, который отправляет эта клавиша в систему. Я это сделал через hidutil, плюс написал небольшую программу, которая слушает события с клавиатуры и запускает скрипт по нажатию на клавишу F18.

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

Инструкции по настройке

Получение кода клавиши dictation

Перед тем как переназначить клавиши нам нужно получить код клавиши dictation. Для этого нужно вызвать в терминале команду:

ioreg -l|grep FnFunctionUsageMap|grep -Eo "0x[0-9a-fA-F]+,0x[0-9a-fA-F]+" 

Эта команда фильтрует вывод ioreg через утилиту grep, так что если вдруг у вас не будет работать эта команда, вы можете сохранить вывод команды ioreg -l в текстовый документ и найти определение переменной FnFunctionUsageMap.

Вернемся к команде. Вывод должен быть примерно таким:

Это и есть коды функциональных и медиа клавиш. В левом столбике идут коды функциональных клавиш (F1, F2, F3 и т.д.), в правом медиа клавиш.

Нам нужна медиа клавиша, которая на кнопке F5. Это будет пятый код сверху в правом столбике:

Далее нужно перевести этот код из 32 битного числа в 64 битный. Для этого нужно заполнить число незначащими нулями 0x000c00cf -> 0x000c000000cf.

Отлично. Теперь мы можем переназначить эту клавишу.

Мапинг через hidutil

Чтобы смапить клавишу dictation на F18 нужно вызвать команду в терминале:

hidutil property --set '{"UserKeyMapping": [{"HIDKeyboardModifierMappingSrc":0x000c000000cf,"HIDKeyboardModifierMappingDst":0x70000006D}]}' 

Более подробно о том как работает hidutil можно найти в Tech Note от Apple.

Плюс нам нужно добавить запуск этого скрипта при запуске системы. Для этого нужно создать файл ~/Library/LaunchAgents/com.nanoant.KeyRemapping.plist с таким содержанием:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.nanoant.KeyRemapping</string> <key>ProgramArguments</key> <array> <string>/usr/bin/hidutil</string> <string>property</string> <string>--set</string> <string>{&quot;UserKeyMapping&quot;:[{&quot;HIDKeyboardModifierMappingSrc&quot;:0x000C000000CF,&quot;HIDKeyboardModifierMappingDst&quot;: 0x70000006D}]}</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist> 

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

Программа для отключения микрофона

Ссылка на программу.

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

Для того чтобы слушать события с клавиатуры приложению нужны права Accessibility и Input Monitoring. Они проставляются в настройках.

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

При первом запуске приложение запросит права. Далее его нужно рестартануть. Для этого вызываем в терминале:

killall Microphone

и снова запускаем приложение.

Обратите внимание на то, что если вы собираете приложение через XCode и запускаете сборку, то вам нужно будет дать права на Accessibility и Input Monitoring XCode тоже. Также при каждой новой сборке вам нужно будет удалять права в настройках и после запуска приложения добавлять их снова.

Полезные ссылки


ссылка на оригинал статьи https://habr.com/ru/articles/785378/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *