Я пытаюсь разработать приложение GTK в Linux. В этом случае у меня нет подключенной клавиатуры, и мне нужно создать key_press_event
для GTK.Как сгенерировать событие нажатия клавиш программно
Я написал многопоточную программу для генерации нажатия клавиши, но она работает только один раз; после этого нажатие клавиши не генерируется.
GtkWidget *window;
объявлен глобальным, чтобы получить тот же обработчик окна для обоих потоков.
Программа имеет 2 темы. Первый содержит главный экран GTK и экран отображения экрана gtk. Второе генерирует ключевые события в соответствии с требованиями пользователя.
Я поместил блок if()
в свой код, но результат тот же.
Сигнал генерируется один раз. После этого он не подходит для 2-го потока (поток генерации сигнала).
Я поместил некоторые отладочные отпечатки, но они не выполнены. Кажется, он ждет 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
из обработчика нажатия S1
и наоборот.
Поскольку у меня нет подключенных клавиатур, мне нужно изменить два экрана на основе некоторого пользовательского ввода через сокеты или что-то в этом роде.
Благодарность jcoppens, действительно это комментарии помогли .was спутать по генерации ключей для нескольких days.this кода working.Shall я задать еще один под сомнение, в то время как при вызове функции таймера генерируется только этот ключ, но с использованием тот же код, как генерировать ключевое событие без таймера –
Вы можете извлечь код из функции таймаута (весь оператор 'if (gdk_keymap_get_entries_for_keyval' (включено)) и поместить его в отдельную функцию. Это было просто для того, чтобы показать, как отправить после 2 секунд. – jcoppens