如何以编程方式生成keypress事件

时间:2015-05-20 12:59:33

标签: c gtk

我正在尝试在Linux中开发GTK应用程序。在这种情况下,我没有连接键盘,我需要为GTK生成key_press_event

我已经编写了一个多线程程序来生成按键,但它只能运行一次;之后,按键没有生成。

GtkWidget *window;被声明为全局,以便为两个线程获得相同的窗口处理程序。

该程序有2个线程。第一个包含GTK主屏幕和gtk屏幕显示代码。第二个根据用户要求生成关键事件。

我将if()块移植到我的代码中,但结果是一样的。

信号生成一次。之后它不会进入第二个线程(信号生成线程)。

我已经放了一些调试打印,但它们没有被执行。它似乎在第一个帖子中等待gtk_main

我的代码如下:

void S1(void)
{
    GtkWidget *Win_1;
    GtkBuilder *builder;        
    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "/home/glade/glade1.glade", NULL);
    window = GTK_WIDGET (gtk_builder_get_object (builder, "Win_1"));        
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
    g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (kp_event), NULL);
    gtk_widget_show_all(window);
    gtk_main(); 
}

kp_event()
{
    gtk_widget_destroy (window);            
    S2();
}

S2S1相同,只是屏幕项目不同。我从S2的按键处理程序调用{​​{1}},反之亦然。

由于我没有连接键盘,我需要根据一些用户输入通过套接字等改变两个屏幕。

1 个答案:

答案 0 :(得分:2)

查看this article,特别是以下代码段:

/* synthesize Alt+O key press */
event = gdk_event_new (GDK_KEY_PRESS);
event->key.window = widget->window;

这一行实际上应该是:

event->key.window = g_object_ref (widget->window);

否则,如果您销毁,您将在以后收到有趣的错误消息 小部件。花了一些时间来弄清楚自己。 :)