Если вы поместите свой встроенный исполняемый файл в комплект приложений, то сможете открыть его в терминале (например, с помощью команды open
), и фокус автоматически переключится на него.
Обратите внимание, что вам, вероятно, все равно нужно будет упаковать свое приложение в пакет.
Во-первых, вам нужно упаковать его, потому что именно так в GLFW FAQ написано .
Лично я считаю, что это необходимо, потому что, по крайней мере, в GLFW, доступном в настоящее время на github ( commit 3e78 ), поверх Mac OS X 10.7.5 обработка клавиатуры украдена терминалом, если у вас нет исполняемого файла, находящегося в комплекте приложения.
Я был свидетелем того, как происходило кража ввода с клавиатуры, даже когда я вручную переключал фокус мыши на окно, которое появлялось при запуске двоичного файла. То есть нажатие клавиш все равно попадало в окно терминала.
Вы можете самостоятельно проверить это поведение в своей собственной системе, взяв одно из примеров приложений для GLFW, например Triangle.app, скопировать его двоичный файл в другой каталог, например /tmp/
, и затем запустить его оттуда. Вот демонстрация того различия, которое я делаю.
% pwd
/Users/pnkfelix/Dev/OpenGL/glfw/objdir/examples/Triangle.app/Contents/MacOS
% ./Triangle
(Команда open
тоже работает:)
% open ../../../Triangle.app
В приведенных выше сценариях нажатие ESC с фокусированным окном треугольника заставило его выйти, как и ожидалось.
Однако проблема возникает, когда программа не находится в связке:
% cp ./Triangle /tmp
% /tmp/Triangle
^[^[^[^[^[^[^
В этом случае нажатие ESC с сфокусированным окном треугольника передавало нажатие клавиши в окно терминала, которое запустило программу. (Это и есть символы ^[
- терминал, отвечающий на нажатия клавиш ESC, которые он получил.)
Хорошей новостью является то, что относительно легко обернуть встроенный исполняемый файл в пакет.
Например, когда я проводил другие эксперименты с привязкой библиотеки GLFW, я обнаружил, что следующего правила Makefile было достаточно для создания временного пакета из исполняемого файла:
test: Triangle.app
open Triangle.app
Triangle.app: Triangle.app/Contents/MacOS/Triangle
Triangle.app/Contents/MacOS/Triangle: triangle
mkdir -p Triangle.app/Contents/MacOS
cp $< $@
(обратите внимание, что вышеприведенные команды с отступом в 8 пробелов не должны быть скопированы дословно, а должны быть переписаны как вкладки, как это требуется для файлов Makefile).
Однако обратите внимание, что вышеприведенное правило Makefile не является официальной структурой для пакетов приложений, и его нельзя доверять чему-либо, кроме личного эксперимента. Apple имеет документацию о том, как официально упаковать ваше приложение в пакет , поэтому вам следует потратить время на выполнение любых действий, которые они описывают, прежде чем выпускать что-либо, что вы производите, в дикую природу. (Например, правила Makefile, перечисленные выше, не пытаются создавать файл Info.plist
, который является одним из обязательных компонентов согласно документации Apple.)