Не оправляются события нажатия клавиши (GTK, C)

Делаю свою программу для рисования.

Есть следующий код:

#include <stdio.h>
#include <gtk/gtk.h>

#include "callbacks.h"
#include "data/list.h"
#include "figure.h"

list *figure_list = NULL;

int main() {
    GtkWidget *window;

    GtkWidget *main_box, *right_box, *draw_box, *down_tool_box;

    GtkWidget *scrolled_window, *draw_area;
    GtkWidget *point_bttn, *line_pp_bttn, *line_la_bttn, *rect_pp_bttn, *rect_wh_bttn, *arc_tp_bttn, *circle_rc_bttn, *help_bttn, *curs_bttn;
    GtkWidget *lay_entry, *set_bttn, *all_bttn, *add_projection_lay_bttn, *crd_label, *hint_label;
    GtkWidget *save_bttn, *open_bttn, *ver_sep;

    figure_list = list_init_node(NULL);

    gtk_init(NULL, NULL);

    // init window
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "FlatDraw");
    gtk_window_set_default_size(GTK_WINDOW(window), 1000, 800);
    gtk_window_set_default_icon_from_file("fd.ico", NULL);

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    // init drawing area
    draw_area = gtk_drawing_area_new();
    gtk_widget_set_size_request(draw_area, 1000, 800);

    // init scrolled window
    scrolled_window = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_ALWAYS, GTK_POLICY_AUTOMATIC);
    gtk_container_add(GTK_CONTAINER(scrolled_window), draw_area);

    // init buttons
    point_bttn = gtk_button_new_with_label("Point");
    line_pp_bttn = gtk_button_new_with_label("Line (PP)");
    line_la_bttn = gtk_button_new_with_label("Line (LA)");
    rect_pp_bttn = gtk_button_new_with_label("Rect (PP)");
    rect_wh_bttn = gtk_button_new_with_label("Rect (WH)");
    arc_tp_bttn = gtk_button_new_with_label("Arc (3P)");
    circle_rc_bttn = gtk_button_new_with_label("Circle (RC)");
    help_bttn = gtk_button_new_with_label("Help");
    curs_bttn = gtk_button_new_with_label("Cursor");

    g_signal_connect(G_OBJECT(point_bttn), "clicked", G_CALLBACK(point_bttn_click), NULL);
    g_signal_connect(G_OBJECT(line_pp_bttn), "clicked", G_CALLBACK(line_bttn_click), NULL);
    g_signal_connect(G_OBJECT(line_la_bttn), "clicked", G_CALLBACK(line_la_bttn_click), window);
    g_signal_connect(G_OBJECT(rect_pp_bttn), "clicked", G_CALLBACK(rect_pp_bttn_click), NULL);
    g_signal_connect(G_OBJECT(rect_wh_bttn), "clicked", G_CALLBACK(rect_wh_bttn_click), window);
    g_signal_connect(G_OBJECT(circle_rc_bttn), "clicked", G_CALLBACK(circle_bttn_click), NULL);
    g_signal_connect(G_OBJECT(arc_tp_bttn), "clicked", G_CALLBACK(arc_bttn_click), window);

    g_signal_connect(G_OBJECT(help_bttn), "clicked", G_CALLBACK(help_bttn_click), window);

    g_signal_connect(G_OBJECT(curs_bttn), "clicked", G_CALLBACK(curs_bttn_click), NULL);

    // init down tool panel widgets
    lay_entry = gtk_entry_new();
    set_bttn = gtk_button_new_with_label("Set");
    all_bttn = gtk_button_new_with_label("All");
    add_projection_lay_bttn = gtk_button_new_with_label("+ / -");

    crd_label = gtk_label_new("(0; 0)");
    hint_label = gtk_label_new("Select tool");

    g_signal_connect(G_OBJECT(set_bttn), "clicked", G_CALLBACK(set_lay_bttn_click), lay_entry);
    g_signal_connect(G_OBJECT(all_bttn), "clicked", G_CALLBACK(all_bttn_click), lay_entry);
    g_signal_connect(G_OBJECT(add_projection_lay_bttn), "clicked", G_CALLBACK(add_projection_lay_bttn_click), lay_entry);

    // file operations widgets
    save_bttn = gtk_button_new_with_label("Save");
    open_bttn = gtk_button_new_with_label("Open");
    ver_sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);

    g_signal_connect(G_OBJECT(save_bttn), "clicked", G_CALLBACK(save_bttn_click), window);
    g_signal_connect(G_OBJECT(open_bttn), "clicked", G_CALLBACK(open_bttn_click), window);

    // init right box
    right_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    
    gtk_box_pack_start(GTK_BOX(right_box), curs_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), point_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), line_pp_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), line_la_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), rect_pp_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), rect_wh_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), arc_tp_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), circle_rc_bttn, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(right_box), help_bttn, TRUE, TRUE, 0);

    // init draw box
    draw_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    gtk_box_pack_start(GTK_BOX(draw_box), scrolled_window, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(draw_box), right_box, FALSE, FALSE, 0);

    // init down tool box
    down_tool_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    gtk_box_pack_start(GTK_BOX(down_tool_box), crd_label, FALSE, FALSE, 5);
    gtk_box_pack_start(GTK_BOX(down_tool_box), hint_label, FALSE, FALSE, 5);
    gtk_box_pack_start(GTK_BOX(down_tool_box), lay_entry, TRUE, TRUE, 3);
    gtk_box_pack_start(GTK_BOX(down_tool_box), set_bttn, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(down_tool_box), all_bttn, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(down_tool_box), add_projection_lay_bttn, FALSE, FALSE, 0);

    // file widgets
    gtk_box_pack_start(GTK_BOX(down_tool_box), ver_sep, FALSE, FALSE, 5);
    gtk_box_pack_start(GTK_BOX(down_tool_box), save_bttn, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(down_tool_box), open_bttn, FALSE, FALSE, 0);

    // init main_box
    main_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_box_pack_start(GTK_BOX(main_box), draw_box, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(main_box), down_tool_box, FALSE, FALSE, 0);

    // add events
    g_signal_connect(G_OBJECT(draw_area), "draw", G_CALLBACK(draw_area_draw), NULL);
    g_signal_connect(G_OBJECT(draw_area), "motion-notify-event", G_CALLBACK(mouse_move), crd_label);
    g_signal_connect(G_OBJECT(draw_area), "button-press-event", G_CALLBACK(mouse_click), NULL);
    g_signal_connect(G_OBJECT(draw_area), "key_press_event", G_CALLBACK(key_press), NULL);

    gtk_widget_add_events(draw_area, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK);
    gtk_widget_set_can_focus(draw_area, TRUE);

    gtk_container_add(GTK_CONTAINER(window), main_box);
    gtk_widget_show_all(window);

    gtk_main();

    list_crawl(figure_list, figure_free_list);
    list_free_list(figure_list);

    return 0;
}

Я добавил событие нажатия клавиши, но оно отправляется ровно до того момента, пока я не начинаю рисовать. Как только я делаю клик в области draw_area, key_press_event перестаёт отправляться. Обработчик нажатия клавиш:

gboolean key_press(GtkWidget *widget, GdkEvent *event, gpointer data) {
    GdkEventKey *ek = (GdkEventKey*)event;

    switch (ek->keyval) {
        case GDK_KEY_Escape:
            if (ch_get_draw_mode() == FG_TYPE_NONE)
                list_crawl(figure_list, unselect);
            else {
                ch_set_draw_mode(FG_TYPE_POINT);
                ch_set_state(0);

                dl_switch_show_preview();
            }
            
            gtk_widget_queue_draw(widget);
        break;
    }

    return TRUE;
}

Ответы (0 шт):