我如何拦截 gtk window 关闭按钮点击?

How do I intercept a gtk window close button click?

在 GTK window 上,标题栏中呈现了一个红色的关闭图标。通常,当您单击它时,window 会关闭并释放其资源。

有没有什么办法可以拦截正常的流程,不让window被破坏,让我以后再展示?即我想隐藏 window 而不是 close/destroy 它。

这是我目前所拥有的。

void destroy_window_callback(GtkWidget* widget, WebWindow_Linux* source)
{
  printf("Don't destroy the window, just hide it.\n");
}


g_signal_connect(web_window, "destroy", G_CALLBACK(destroy_window_callback), this);

这可能就是您需要的

#include <gtk/gtk.h>

void
on_button_clicked(GtkButton *button, gpointer data)
{
    GtkWidget *widget;
    widget = (GtkWidget *) data;
    if (widget == NULL)
        return;
    gtk_widget_show(widget);
    return;
}

gboolean
on_widget_deleted(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    gtk_widget_hide(widget);
    return TRUE;
}

int
main(int argc, char **argv)
{
    GtkWidget *window1;
    GtkWidget *window2;
    GtkWidget *button;
    gtk_init(&argc, &argv);

    window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    button = gtk_button_new_with_label("Show again...");

    g_signal_connect(G_OBJECT(window1),
        "destroy", gtk_main_quit, NULL);
    g_signal_connect(G_OBJECT(window2), 
        "delete-event", G_CALLBACK(on_widget_deleted), NULL);
    g_signal_connect(G_OBJECT(button), 
        "clicked", G_CALLBACK(on_button_clicked), window2);
    gtk_container_add(GTK_CONTAINER(window1), button);
    gtk_widget_set_size_request(window1, 300, 100);
    gtk_widget_set_size_request(window2, 300, 100);

    gtk_widget_show_all(window1);
    gtk_widget_show(window2);

    gtk_main();
    return 0;
}

我们基本上有三个小部件,两个顶级 windows 和一个按钮。当 window 的关闭按钮被按下时,第一个 window 将它的 "destroy" 事件连接到 gtk_main_quit() 退出应用程序。第二个 window 将其 "delete-event" 连接到自定义函数。这是最重要的。如您所见,returns TRUE 表示信号已被处理,从而阻止调用默认处理程序,从而阻止调用 gtk_widget_destroy()。如果需要,我们也可以在其中隐藏小部件。