我正在尝试在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();
}
S2
与S1
相同,只是屏幕项目不同。我从S2
的按键处理程序调用{{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);
否则,如果您销毁,您将在以后收到有趣的错误消息 小部件。花了一些时间来弄清楚自己。 :)