Console Framework на Mac OS X

Written by elwood

Решил, что пора бы добавить поддержку макоси тоже. Всё портирование свелось к нескольким простым вещам:

  • Собрать libtermkey. Под мак mono почему-то исключительно 32-битный, поэтому нужно следить за разрядностью выходного dylib-модуля. По сути достаточно в майкфайл добавить CCFLAGS += -arch i386 -arch x86_64 (я собирал fat binary) и выполнить make. Если не указать i386, скорее всего будет собран 64-разрядный модуль, и моно не сможет его загрузить для интеропа, будет сбивающий с толку DllNotFoundException (на самом деле dll found, но просто не может быть загружена).
  • Найти libncurses и сделать для него symlink. Сам пакет может быть установлен при помощи MacPorts. У меня он автоматически поставился при установке midnight commander (через MacPorts)
  • Убрать eventfd в качестве объекта-источника poll-сигналов. Заменил на self-pipe.
  • Корректно проставить symlinks к оставшимся библиотекам (libc.so). Или прописать dllmap в App.config-файле – моно умеет оттуда распарсивать пути к библиотекам.

Всё в принципе работоспособно, но, к сожалению, качество эмуляторов терминала под Mac оставляет желать лучшего..

Стандартный терминал Mac OS X

Стандартный Terminal.app порадовал хорошим рендерингом, но огорчил отсутствием поддержки мыши, отсутствием отсылки нажатий клавиш с зажатым Ctrl. Также при ресайзе окна в приложение не приходит соответствующий сигнал. Впрочем, mc изменение размера обрабатывает нормально, так что должен быть workaround. Что касается мыши, то частично можно заставить её работать, установив EasySIMBL и mouseterm. Но работают только нажатия, перемещение нажатой мыши почему-то работать не хочет. Впрочем, mc даже нажатия при установленном плагине не воспринимает. Картинки кликабельны.

ConsoleFramework-MacOs-Terminal

iTerm2

Бесплатный альтернативный эмулятор терминала для макоси. Вполне хорош, поддерживает работу с мышью, рендеринг благодатный, только символы псевдографики не очень красивые выводятся. Но можно поменять шрифт на Andale Mono, тогда всё становится вообще идеально (на скриншоте шрифт по умолчанию – Monaco). Есть проблемы с ресайзом, но в mc ресайз работает, поэтому должен быть workaround. Пока это лучший эмулятор терминала из опробованных.

ConsoleFramework-MacOs-ITerm2

xterm

Решил попробовать xterm, который идеально себя показывал на всех линуксах. К слову, установить его оказалось несложно – достаточно поставить X-сервер Xquartz и установить xterm из MacPorts (sudo port install xterm). Но, к сожалению, в этот раз он не оправдал ожиданий. При запуске из стандартного терминала не подхватывается utf8:

ConsoleFramework-MacOs-xterm

При запуске через Cmd+n (из контекста запущенного XQuartz) набор символов, вроде, получше, но всё равно не хватает нормальных юникодных символов:

ConsoleFramework-MacOs-xterm2

putty

А ещё был опробован putty ! Установился он очень просто из MacPorts (и, как и xterm, требует наличия XQuartz). И поэтому мне не пришлось возиться с гайдом http://putty.org.ru/articles/install-putty-macosx.html, который показался мне сложноватым. Чтобы подключиться к localhost по ssh, пришлось разрешить удалённый доступ в настройках Mac OS. Рендеринг putty тоже выглядит криво, хотя кодировка UTF-8 выставлена (видимо, это уже какая-то внутренняя проблема XQuartz и его набора шрифтов), mc тоже рендерится с кракозябрами. Хорошо: поддержка мыши. Ресайз – не работает в console framework, но опять же, в mc работает исправно.

ConsoleFramework-MacOs-putty

Заключение

Нужно найти workaround для ресайза окна, чтобы работало везде, где работает midnight commander. В остальном придётся ждать улучшений самих эмуляторов терминала. На текущий момент наиболее перспективным для реальной работы видится iTerm2 и стандартный терминал (если забить на поддержку мыши или делать приложения, в которых всё можно выполнить с использованием только одной клавиатуры). Хочется также попробовать позапускать console framework на FreeBSD.