gtk_window_present不会将窗口移动到前台

时间:2017-11-26 15:42:43

标签: macos gtk3

我在macOS上。通过在超时时间内重复调用gtk_window_present稍微修改第一个示例代码段here,我们得到:

#include <gtk/gtk.h>

static gboolean timeout_callback (gpointer window) {
    printf("timeout\n");
    gtk_window_present (GTK_WINDOW (window));
    return TRUE;
}

static void activate (GtkApplication* app, gpointer user_data) {
    GtkWidget *window;

    window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), "Window");
    gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    gtk_widget_show_all (window);

    g_timeout_add(1000, timeout_callback, window);
    gtk_window_present (GTK_WINDOW (window));
}

int main (int argc, char **argv) {
    GtkApplication *app;
    int status;

    app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    status = g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref (app);

    return status;
}

然而,窗口实际上并没有出现在前台。如何在macOS / OS X中将主gtk +窗口提升到前面?

1 个答案:

答案 0 :(得分:2)

保罗戴维斯在this discussion中说:

  

OS X / MacOS有一个窗口分层的概念,它不存在于X Window或其中   GTK(不明确,无论如何)。

     

Windows属于特定类型图层。没有办法做出来   窗口在所有其他窗口之上,除非它是用户类型   最上层。

     

set_keep_above()的当前实现(假设它就像   我最初为GTK + 2工作过的那个只为我们提供了一个窗口   它的图层组的顶部(就像Cocoa等价物一样)。

     

如果你希望窗口真的在#34;,你必须确保它会   在上层,在GTK术语中意味着它需要是一个弹出窗口   (例如)。

我发现唯一可以解决的问题是特定于操作系统的修复程序,据我所知,这是一个无法用C语言完成的修复程序。

我建议的修复是将Objective-C(例如foreground.m)文件添加到项目中,其中包含以下内容:

#import <AppKit/AppKit.h>

void macos_force_foreground_level() {
    [NSApp activateIgnoringOtherApps: YES];
}

然后,您还可以通过创建以下标头文件将此功能提供给C程序的其余部分:(例如foreground.h

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

void macos_force_foreground_level();

#ifdef __cplusplus
}
#endif

(如果你在C ++程序中实际也使用了这个,那么__cplusplus的内容是适用的。如果你不是,你可以将头文件缩减为#pragma once行和void macos_force_foreground_level();行。)

将头文件包含在您希望能够在前台显示主应用程序窗口的位置;然后,您可以调用macos_force_foreground_level()来实际执行此操作。

当然,现在您已经为项目添加了一个Objective-C文件。在Mac上,您可以使用.m将此.o文件编译为gcc文件(在Mac上,它实际上是Apple自己的clang版本)。 (在编译-std=c11时,请确保您没有传递.m之类的标记,因为该文件甚至不是C;))。对于链接,请确保将-framework Foundation -framework AppKit添加到链接器标志。

如果您在构建系统工作时遇到困难,可以在评论中提问,或者提出其他问题。