强制窗口前/焦?

时间:2010-02-13 05:14:20

标签: macos focus

我正在GLFW中编写一个MacOSX捆绑应用程序。

当窗口弹出时,我希望它在所有其他窗口的顶部。我也想让它抓住焦点(我在vim中编码,然后键入“:make run” - 之后我想与应用程序进行交互)。

问题:

1)我可以使用一些API调用来实现这一目标吗? 2)我是否可以在MacOSX中进行一些配置,例如“名为blah的程序,让它专注于启动”?

谢谢!

2 个答案:

答案 0 :(得分:1)

可可API是[NSWindow makeKeyAndOrderFront:],你可以从你的库中做类似的事情。

答案 1 :(得分:0)

如果您将构建的可执行文件包装在应用程序包中,那么您应该能够在终端中打开它(例如通过open命令)并且焦点将自动切换到它。

请注意,您可能还需要将应用程序打包成捆绑包。

  1. 首先,您需要打包它,因为这就是GLFW FAQ says

  2. 我个人认为这是必要的,因为至少在github(commit 3e78)目前可用的GLFW中,在Mac OS X 10.7.5上,键盘处理被盗如果您没有位于应用程序包中的可执行文件,则由终端提供。


  3. 即使手动将鼠标焦点切换到运行二进制文件时弹出的窗口,我也目睹了键盘输入窃取行为的发生。也就是说,我输入的击键仍然在终端窗口中结束。

    您可以在自己的系统上自行测试此行为,方法是使用一个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文档中所需的组件之一。)