Создать событие BackSpace gtk / C - PullRequest
1 голос
/ 06 августа 2020

В 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...