InfoBar仅在窗口更改时显示

时间:2016-09-01 12:40:29

标签: c gtk3

为什么只有在我改变窗口(焦点)时才能看到GtkInfoBar?

点击F5键可以看到InfoBar。关闭信息栏并再次点击F5。

在我的debian 8(Gnome 3.20)系统上,InfoBar仅在第一次可见,从第二次开始,只有在我更改应用程序窗口的焦点时才可见。

// gcc `pkg-config --cflags gtk+-3.0` -o info_bar infobar_nonglade.c `pkg-config --libs gtk+-3.0`
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

// Callback to close the window with Esc key
static gboolean check_escape(GtkWidget *widget, GdkEventKey *event, gpointer data) {
        if (event->keyval == GDK_KEY_Escape) {
                gtk_main_quit();
                return TRUE;
        }
        return FALSE;
}

static gboolean on_key_f5(GtkWidget *widget, GdkEventKey *event, gpointer infobar) {
        if (event->keyval == GDK_KEY_F5) {
                gtk_widget_set_visible(infobar, !(gtk_widget_get_visible(infobar)));
                return TRUE;
        }
        return FALSE;
}

int main (int argc, char **argv) {
        gtk_init(&argc, &argv);
        GtkWidget *button, *content_area, *infobar, *message_label, *vbox, *window;
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
        infobar = gtk_info_bar_new();
        button = gtk_button_new_with_label ("OK");
        gtk_window_set_default_size (GTK_WINDOW (window), 1024, 600);
        gtk_widget_set_no_show_all (infobar, TRUE);
        gtk_info_bar_add_button (GTK_INFO_BAR (infobar),
                                 "OK",
                                 GTK_RESPONSE_OK);
        g_signal_connect (infobar, "response", G_CALLBACK (gtk_widget_hide), NULL);
        gtk_container_add (GTK_CONTAINER (window), vbox);
        gtk_box_pack_start (GTK_BOX (vbox), infobar, FALSE, FALSE, 0);
        gtk_widget_show_all (vbox);
        // Connect callback to close the window with the Esc key
        g_signal_connect (window, "key_press_event", G_CALLBACK (check_escape), NULL);
        g_signal_connect (window, "key_press_event", G_CALLBACK (on_key_f5), infobar);
        gtk_widget_show_all (window);
        gtk_main();

        return 0;
}

2 个答案:

答案 0 :(得分:1)

我无法在我的机器上测试它,但您可以尝试:

gtk_widget_set_visible(infobar, !(gtk_widget_get_visible(infobar)));

而不是

gtk_widget_set_no_show_all (infobar, FALSE);
gtk_widget_show_all (infobar);

另外,为什么你在TRUE上返回gboolean on_key_f5的事件无效?

答案 1 :(得分:1)

这看起来像一个众所周知的老臭虫:(

简单的解决方案是禁用动画。我完全可以忍受。

int main (int argc, char **argv) {
        gtk_init(&argc, &argv);
        // Fix InfoBar Bug: https://bugzilla.gnome.org/show_bug.cgi?id=710888
        g_object_set (gtk_settings_get_default (), "gtk-enable-animations", FALSE, NULL);
...
}