我正在GLFW中编写一个MacOSX捆绑应用程序。
当窗口弹出时,我希望它在所有其他窗口的顶部。我也想让它抓住焦点(我在vim中编码,然后键入“:make run” - 之后我想与应用程序进行交互)。
问题:
1)我可以使用一些API调用来实现这一目标吗? 2)我是否可以在MacOSX中进行一些配置,例如“名为blah的程序,让它专注于启动”?
谢谢!
答案 0 :(得分:1)
可可API是[NSWindow makeKeyAndOrderFront:],你可以从你的库中做类似的事情。
答案 1 :(得分:0)
如果您将构建的可执行文件包装在应用程序包中,那么您应该能够在终端中打开它(例如通过open
命令)并且焦点将自动切换到它。
请注意,您可能还需要将应用程序打包成捆绑包。
首先,您需要打包它,因为这就是GLFW FAQ says。
我个人认为这是必要的,因为至少在github(commit 3e78)目前可用的GLFW中,在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拥有documentation on how to officially package your application in a bundle,所以你应该花时间做他们描述的任何步骤,然后再发布你生产的任何东西。 (例如,上面列出的Makefile规则不会尝试生成Info.plist
文件,这是Apple文档中所需的组件之一。)