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



Изменения в интерфейсе


Сильно изменился интерфейс, в лучшую сторону, все стало удобно и видно, вот так выглядел Mahou раньше:



А теперь он выглядит вот так:



Как я писал плагин для Sublime Text 3


Функция "Подсказка текущей раскладки возле текстового курсора(каретки)" получила возможность отображения в Sublime Text 3, используя плагин который я написал специально для этого.


Все началось с того что я искал возможность взятия позиции на которой находится сейчас текстовый курсор, искал способ и нашел на форумах Sublime Text > view.rowcol(view.sel()[0].begin()) которая возвращала линию и количество букв на котором сейчас текстовый курсор, это было то что нужно. Потом я подумал "А как передать эти данные в Mahou из Sublime Text?", и вспомнил о socket'ах (знал я о них совсем чуть-чуть) и решил писать сервер который будет работать на 127.0.0.1 (localhost) и порте 7777, сначала ничего не работало, потом я почитал пару статей про socket'ы и начал понимать как они работают. Потом я начал читать Sublime Text 3 API, далее начал создавать плагин:


Сначала инициализировал сервер в который будут выдаваться данные, потом создал EvenListener с слушанием на события:


  1. on_window_command При показе/скрытии и т.д. окон (window), в частности я использовал ее для боковой панели.
  2. on_modified При изменении view'а.
  3. on_activated При активации редактора/вкладки/панели.
  4. on_text_command При нажатии любой клавиши клавиатуры/мыши.

Потом начал искать способ получить координаты X, Y позиции каретки, из ST3API я узнал что можно получить высоту строки и ширину текста, если их умножить на линии и количество букв то можно получить нужные координаты. Но была одна проблема — символ табуляции считался за 1 символ, так что я решил что нужно подсчитать количество Tab'ов в линии и умножить их на 3 и добавить к количеству букв — и оно работало!


Потом я добавил определение ширины боковой панели, но все не было как просто, потому что при ее скрытии/показе она использует анимацию, и EventListener возвращал ширину которая была до завершения анимации, смотря на другие возможные API я пришел к выводу что другого решения этой проблемы кроме как добавить время ожидания окончания анимации перед отправкой данных на сервер — нет, и добавил 300 мс ожидания — и оно отлично работало!


Потом я создал настройки для плагина, создал клиент который получал данные с сервера в Mahou и все работало.


Сильно улучшены функции использующие таймеры.


Функции которые используют таймеры:


  • Подсказки языка возле мыши/каретки.
  • Таймер отключатель CapsLock.
  • Подсвечивать Scroll-Lock при раскладке #1 активной.
  • Флаги стран в трее.

Как я улучшил их:


Раньше при тике таймера допустим для флагов стран в трее — всегда менялась иконка, что в итоге давало большую нагрузку на ЦПУ и иногда даже приводило в вылету GDI+, так что я решил внедрить переменную которая будет хранить название последнего измененного языка, и условие при котором если текущий языка равен предыдущему то не менять иконку чем значительно уменьшил нагрузку на ЦПУ, остальные функции я улучшил похожим образом.


Mahou теперь использует настройки в ОЗУ.


Что это значит? Это значить что раньше при чтении определенной настройки использовался диск, создавая лишнюю нагрузку, я решил создать переменные для каждой настройки чтобы не использовать диск а использовать их (ОЗУ). Теперь же чтение/запись с/на диска происходит только при сохранение/загрузке настроек.


Что еще нового?


  • Функции конверсии регистра текста.
  • Очистка памяти, теперь Mahou потребляет 3~5МБ ОЗУ.
  • Улучшена поддержка приложений Microsoft(Office, Skype, etc.)
  • Добавлена возможность изменить текст для подсказок языка.
  • Обновлено отладочная информация.
  • Обновлена Wiki для Mahou 2.0.

Ссылки


Поделиться с друзьями
-->

Комментарии (6)


  1. Taciturn
    22.03.2017 21:31
    +1

    Проблемы при работе через RDP:
    В cmd.exe не работает.
    Ломает CapsLock (в настойках таймер отключатель CapsLock выключен) — включаю через Alt+CapsLock, лампочка горит, а буквы маленькие.

    Даже без RDP ломает Ctrl+CapsLock — без Mahou такая комбинация включат CapsLock, а с Mahou переключает раскладку, хотя в настройках указано переключение по CapsLock без всяких модификаторов. Комбинации с Alt или Shift не ломает.


    1. BladeMight
      23.03.2017 17:23

      @Taciturn Исправил Ctrl+CapsLock в Mahou-v2.1.1.3, по поводу того как не работает в cmd.exe, можно по подробнее?


      1. Taciturn
        23.03.2017 22:04

        Спасибо за Crtl!
        С RDP всё просто — подключаемся через RDP к Winwos 7/8/10/2008/2012, запускаем Mahou, запускаем cmd.exe, нажимаем CapsLock — раскладка не переключается. В других программах, например блокноте, всё переключается.


  1. t0lik
    23.03.2017 17:24

    Меня до сих пор вымораживает неспособность Punto нормально сменить раскладку несколько выделенных слов сразу в поле ввода комментария к коммиту в TFS в Visual Studio (2015? 2017 — без разницы). Он тупо оставляет в новой раскладке только последнее слово. Ваша программа в этом случае будет корректно работать? Вы можете это проверить?


    1. BladeMight
      23.03.2017 17:27

      @t0lik Я не могу проверить(т.к. у меня нет VS) но должно работать, т.к. недавно Я исправил Конвертацию выделенного в MS-Office 2016, думаю к VS это тоже относиться, если у Вас работает напишите.


    1. fareloz
      23.03.2017 19:02
      +1

      Я проверил на VS 2017 в окне Team Explorer Changes (надеюсь верно) в поле для коммит месседжа. У меня сработало.