GtkEntry cannot receive "key-pressed" signal when I type numbers, letters and punctuation marks.
GTK Version: 4.8.3:
GtkEntry cannot receive "key-pressed" signal when typing numbers, letters and punctuation marks. Meanwhile it can receive "key-released" signal when inputing numbers, letters and punctuation marks. But GtkEntry can receive both "key-pressed" and "key-released" signal when typing the keys like "Tab", "Shift", "Page down", etc. So I wonder why GtkEntry cannot receive "key-pressed" signal when typing numbers, letters and punctuation marks. It's the code:
/* Code for GTK4 (GTK4.8.3) */
static gboolean cb_key_pressed(GtkEventControllerKey *controller,
guint keyval,
guint keycode,
GdkModifierType state,
gpointer user_data)
{
g_print("Key \"%s\" pressed\n", gdk_keyval_name(keyval));
return FALSE;
}
static void
cb_key_released (GtkEventControllerKey* Controller,
guint keyval,
guint keycode,
GdkModifierType state,
gpointer user_data)
{
g_print("Key \"%s\" released\n", gdk_keyval_name(keyval));
}
static void activate(GtkApplication *app, gpointer user_data)
{
GtkWidget *window, *grid, *entry;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "GTK4 - Key-Pressed");
gtk_widget_set_size_request(window, 300, 200);
grid = gtk_grid_new();
gtk_window_set_child (GTK_WINDOW (window), grid);
entry = gtk_entry_new();
gtk_grid_attach(GTK_GRID(grid), entry, 0, 0, 1, 1);
GtkEventController *event_controller = gtk_event_controller_key_new();
gtk_widget_add_controller(GTK_WIDGET(entry), event_controller);
g_signal_connect(G_OBJECT(event_controller),
"key-pressed",
G_CALLBACK(cb_key_pressed),
(gpointer)entry);
g_signal_connect(G_OBJECT(event_controller),
"key-released",
G_CALLBACK(cb_key_released),
(gpointer)entry);
gtk_window_present(GTK_WINDOW(window));
}
When I type '1' and 'a',it will print:
Key "1" released
Key "a" released
There is no "Key "1" pressed" and "Key "a" pressed" printed .
when I type the key "page down", it will print:
Key "Page_Down" pressed
Key "Page_Down" released
But when I use "GtkEntry::key-press-event" and "GtkEntry::key-release-event" signal in GTK+-3 it will work expected. It's the code:
/* Code for GTK3 (GTK3.24.35) */
static gboolean cb_key_press_event(GtkWidget *widget, GdkEventKey *event_key, gpointer data)
{
unsigned int keyval;
keyval = event_key->keyval;
g_print("Key \"%s\" pressed\n", gdk_keyval_name(keyval));
return FALSE;
}
static gboolean cb_key_release_event(GtkWidget *widget, GdkEventKey *event_key, gpointer data)
{
unsigned int keyval;
keyval = event_key->keyval;
g_print("Key \"%s\" released\n", gdk_keyval_name(keyval));
return FALSE;
}
static void
activate (GtkApplication *app, gpointer user_data)
{
GtkWidget *window, *grid, *entry, *label;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "GKT+3 - key-press-event");
gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
grid = gtk_grid_new();
gtk_container_add (GTK_CONTAINER (window), grid);
entry = gtk_entry_new();
gtk_grid_attach(GTK_GRID(grid), entry, 0, 0, 1, 1);
g_signal_connect(entry, "key-press-event", G_CALLBACK(cb_key_press_event), NULL);
g_signal_connect(entry, "key-release-event", G_CALLBACK(cb_key_release_event), NULL);
gtk_widget_show_all(window);
}
So when I type '1' and 'a',it will print:
Key "1" pressed
Key "1" released
Key "a" pressed
Key "a" released
and when I type the key "page down", it will print:
Key "Page_Down" pressed
Key "Page_Down" released