Заставить окно вперед / фокус? - PullRequest
1 голос
/ 13 февраля 2010

Я пишу приложение для MacOSX в GLFW.

Когда всплывает окно, я хочу, чтобы оно было поверх всех остальных окон. Я также хочу, чтобы он захватил фокус (я пишу в vim, и я набираю «: make run» - и после этого я хочу взаимодействовать с приложением).

Вопрос:

1) Есть ли какой-нибудь вызов API, который я могу использовать, чтобы это произошло? 2) Есть ли какая-нибудь конфигурация, которую я могу сделать в MacOSX, чтобы сказать что-то вроде «программы с именем blah, сфокусировать ее на запуске»?

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 февраля 2010

API какао - это [NSWindow makeKeyAndOrderFront:], вероятно, вы можете сделать нечто подобное из своей библиотеки.

0 голосов
/ 28 января 2013

Если вы поместите свой встроенный исполняемый файл в комплект приложений, то сможете открыть его в терминале (например, с помощью команды open), и фокус автоматически переключится на него.

Обратите внимание, что вам, вероятно, все равно нужно будет упаковать свое приложение в пакет.

  1. Во-первых, вам нужно упаковать его, потому что именно так в GLFW FAQ написано .

  2. Лично я считаю, что это необходимо, потому что, по крайней мере, в 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...