如何为弹出的Gtk.窗口提供键盘焦点

如何为弹出的Gtk.窗口提供键盘焦点,gtk,Gtk,我有一个弹出窗口(使用window\u POPUP类型创建),其中包含一些小部件,包括一个文本条目。问题是,当我单击条目时,它没有获得焦点,因此我无法键入任何内容。是否需要设置任何标志以允许窗口获得键盘焦点?\include #include <gtk/gtk.h> static gboolean delete_event( GtkWidget *widget, GdkEvent *event,

我有一个弹出窗口(使用window\u POPUP类型创建),其中包含一些小部件,包括一个文本条目。问题是,当我单击条目时,它没有获得焦点,因此我无法键入任何内容。是否需要设置任何标志以允许窗口获得键盘焦点?

\include
#include <gtk/gtk.h>

static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    g_print ("delete event occurred\n");
    gtk_main_quit ();
    return TRUE;
}

static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *windowpopup;
    GtkWidget *button;

    gtk_init (&argc, &argv);

    /* create a new window */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    windowpopup = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_transient_for(GTK_WINDOW(windowpopup),GTK_WINDOW(window));
    gtk_window_set_destroy_with_parent(GTK_WINDOW(windowpopup),TRUE); 
    gtk_widget_show (windowpopup);

    g_signal_connect (G_OBJECT (window), "delete_event",
              G_CALLBACK (delete_event), NULL);
    g_signal_connect (G_OBJECT (window), "destroy",
              G_CALLBACK (destroy), NULL);

    /* Creates a new button with the label "Hello World". */
    button = gtk_button_new_with_label ("Hello World");

    g_signal_connect_swapped (G_OBJECT (button), "clicked",
                  G_CALLBACK (gtk_widget_destroy),
                              G_OBJECT (window));

    gtk_container_add (GTK_CONTAINER (window), button);

    gtk_widget_show (button);
    gtk_widget_show (window);

    gtk_main ();

    return 0;
}
静态gboolean delete_事件(GtkWidget*小部件, GdkEvent*事件, gpointer数据) { g_print(“发生删除事件”); gtk_main_quit(); 返回TRUE; } 静态无效销毁(GtkWidget*小部件, gpointer数据) { gtk_main_quit(); } int main(int argc, 字符*argv[] { GtkWidget*窗口; GtkWidget*窗口弹出窗口; GtkWidget*按钮; gtk_init(&argc,&argv); /*创建一个新窗口*/ 窗口=gtk_窗口_新建(gtk_窗口_顶层); windowpopup=gtk_window_new(gtk_window_顶层); gtk_窗口设置(gtk_窗口(窗口弹出)、gtk_窗口(窗口)); gtk_窗口_设置_销毁_与_父项(gtk_窗口(windowpopup),TRUE); gtk_小部件_显示(窗口弹出窗口); g_信号连接(g_对象(窗口),“删除事件”, G_回调(删除_事件),NULL); g_信号连接(g_对象(窗口),“销毁”, G_回调(销毁),空); /*创建一个标签为“Hello World”的新按钮*/ button=gtk_button_new_,带_标签(“Hello World”); g_信号连接交换(g_对象(按钮),“点击”, G_回调(gtk_widget_destroy), G_对象(窗口)); gtk_容器添加(gtk_容器(窗口),按钮); gtk_小部件_显示(按钮); gtk_widget_show(窗口); gtk_main(); 返回0; }
对于需要焦点的gtk窗口,不能使用窗口弹出窗口。相反,您应该使用GTK_WINDOW_TOPLEVEL类型的GtkWindow并调用下一个函数(或方法)


这对我有用。。。不幸的是,当此“弹出窗口”被销毁时,窗口列表中的图标会短时间闪烁

尽管有前面的答案和GTK参考,但在使用GTK_窗口弹出窗口时仍有可能获取键盘焦点。您需要连接到“show”活动

。。。通过尝试抓取键盘的回调:

static void on_window_show(GtkWidget *w, gpointer user_data) {
    /* grabbing might not succeed immediately... */
    while (gdk_keyboard_grab(w->window, FALSE, GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS) {
        /* ...wait a while and try again */
        sleep(0.1);
    }
}

这对我来说非常有效。

这将独占键盘。用鼠标单击其他程序的窗口不会将键盘焦点转移到它们。可能有工作,但我不知道有。
GtkWindow *w = gtk_window_new(GTK_WINDOW_POPUP);
g_signal_connect(G_OBJECT(w), "show", G_CALLBACK(on_window_show), NULL);
static void on_window_show(GtkWidget *w, gpointer user_data) {
    /* grabbing might not succeed immediately... */
    while (gdk_keyboard_grab(w->window, FALSE, GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS) {
        /* ...wait a while and try again */
        sleep(0.1);
    }
}