2015-05-20 4 views
2

Я пытаюсь разработать приложение 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 и наоборот.

Поскольку у меня нет подключенных клавиатур, мне нужно изменить два экрана на основе некоторого пользовательского ввода через сокеты или что-то в этом роде.

ответ

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); 

В противном случае вы получите интересные сообщения об ошибках позже если вы уничтожаете виджетов. Понадобилось время, чтобы разобраться в себе. :)


+0

Благодарность jcoppens, действительно это комментарии помогли .was спутать по генерации ключей для нескольких days.this кода working.Shall я задать еще один под сомнение, в то время как при вызове функции таймера генерируется только этот ключ, но с использованием тот же код, как генерировать ключевое событие без таймера –

+0

Вы можете извлечь код из функции таймаута (весь оператор 'if (gdk_keymap_get_entries_for_keyval' (включено)) и поместить его в отдельную функцию. Это было просто для того, чтобы показать, как отправить после 2 секунд. – jcoppens

Смежные вопросы