如何拦截 gtk 窗口关闭按钮单击?

Mat*_*att 4 c linux gtk

在 GTK 窗口上,标题栏中呈现一个红色的关闭图标。通常,当您单击此按钮时,窗口将关闭并释放其资源。

有没有办法拦截正常流程以防止窗口被破坏,以便我稍后可以再次显示它?即我想隐藏窗口而不是关闭/销毁它。

这是我到目前为止所拥有的。

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);
Run Code Online (Sandbox Code Playgroud)

Iha*_*imi 6

这可能就是你所需要的

#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;
}
Run Code Online (Sandbox Code Playgroud)

我们基本上有三个小部件、两个顶级窗口和一个按钮。第一个窗口的事件与按下窗口的关闭按钮时退出应用程序"destroy"相关。gtk_main_quit()第二个窗口连接"delete-event"到自定义函数。这是最重要的一点。正如您所看到的,它返回TRUE表明信号已被处理,从而阻止调用默认处理程序,从而阻止调用gtk_widget_destroy(). 如果需要的话,我们还可以在其中隐藏小部件。