В GTK / C я хочу распространить нажатие клавиши backspace
на нажатие button
. Следуя предложению в предыдущем сообщении , я попытался с небольшой программой: создать GdkEventKey , затем использовать gtk_propagate_event
, чтобы установить нажатие клавиши на кнопку. Программа компилируется нормально, но работает не так, как я ожидал. Я нашел это , это и это , но мне не удалось заставить свой код работать (когда я нажимаю btn_bspace
, я хочу, чтобы он сгенерировал событие возврата в text_entry
). Не могли бы вы взглянуть на мой код и сказать, что не так? Большое спасибо!
//compile with gcc -o main main.c `pkg-config --cflags --libs gtk+-3.0`
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
GtkWidget *btn_bspace;
GtkWidget *entry;
GtkWidget *window;
GtkWidget *box;
gboolean on_btn_bspace_clicked(GtkButton *button, gpointer data)
{
guint keyval = GDK_KEY_BackSpace;
GdkEvent* event = gdk_event_new(GDK_KEY_PRESS);
((GdkEventKey*)event)->window = gtk_widget_get_window(GTK_WIDGET(window));
((GdkEventKey*)event)->send_event = TRUE;
((GdkEventKey*)event)->time = GDK_CURRENT_TIME;
((GdkEventKey*)event)->state = GDK_KEY_PRESS_MASK;
((GdkEventKey*)event)->keyval = keyval;
((GdkEventKey*)event)->state = 0;
((GdkEventKey*)event)->length = 0;
((GdkEventKey*)event)->string = 0;
((GdkEventKey*)event)->hardware_keycode = 0xff08;
((GdkEventKey*)event)->group = 0;
gtk_propagate_event(entry, event);
return FALSE;
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
box = gtk_box_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), box);
gtk_widget_show(box);
entry = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(entry), "testing");
gtk_box_pack_start(GTK_BOX(box), entry, TRUE, TRUE, 0);
gtk_widget_show(entry);
btn_bspace = gtk_button_new_with_label("Backspace");
g_signal_connect(btn_bspace, "clicked", G_CALLBACK(on_btn_bspace_clicked), NULL);
gtk_box_pack_start(GTK_BOX(box), btn_bspace, TRUE, TRUE, 0);
gtk_widget_show(btn_bspace);
gtk_widget_show(window);
gtk_main();
return 0;
}
// called when window is closed
void on_window_main_destroy()
{
gtk_main_quit();
}
Обновление : назначьте ((GdkEventKey)event)->window
на GdkWindow