我在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 +窗口提升到前面?
答案 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
添加到链接器标志。
如果您在构建系统工作时遇到困难,可以在评论中提问,或者提出其他问题。