aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/interface-gtk/interface.c
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2021-10-15 00:52:54 +0300
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2021-10-15 00:52:54 +0300
commit3bafc5df177159a3fc888f8f0b8888574362bd20 (patch)
tree512466384ae1ae2f2b94355d9204aa5e6400ef97 /src/interface-gtk/interface.c
parentfdb89d9b0744b98dcc8ceacd53fcdd255fbc0b1e (diff)
downloadsciteco-3bafc5df177159a3fc888f8f0b8888574362bd20.tar.gz
Gtk: prevent hard to predict teco_interface_key_pressed_cb() recursions
* Due to introducing another gtk_main_iteration_do(), there could indeed be unforseen recursions of teco_interface_key_pressed_cb() that resulted in additional teco_interface_handle_key_press() calls. * This did not cause crashes, but we better prevent recursions altogether. While emptying the key event queue, we only allow other events to be queued by all possibly recursive invocations of teco_interface_key_pressed_cb().
Diffstat (limited to 'src/interface-gtk/interface.c')
-rw-r--r--src/interface-gtk/interface.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/interface-gtk/interface.c b/src/interface-gtk/interface.c
index d8cc7cd..a6369f1 100644
--- a/src/interface-gtk/interface.c
+++ b/src/interface-gtk/interface.c
@@ -1116,6 +1116,7 @@ teco_interface_cmdline_size_allocate_cb(GtkWidget *widget,
static gboolean
teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{
+ static gboolean recursed = FALSE;
g_autoptr(GError) error = NULL;
#ifdef DEBUG
@@ -1124,7 +1125,7 @@ teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer us
event->state & GDK_SHIFT_MASK, event->state & GDK_CONTROL_MASK);
#endif
- if (teco_cmdline.pc < teco_cmdline.effective_len) {
+ if (recursed) {
/*
* We're already executing, so this event is processed
* from gtk_main_iteration_do().
@@ -1151,6 +1152,8 @@ teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer us
return TRUE;
}
+ recursed = TRUE;
+
g_queue_push_tail(teco_interface.event_queue, gdk_event_copy((GdkEvent *)event));
GdkWindow *top_window = gdk_window_get_toplevel(gtk_widget_get_window(teco_interface.window));
@@ -1189,6 +1192,7 @@ teco_interface_key_pressed_cb(GtkWidget *widget, GdkEventKey *event, gpointer us
gtk_main_iteration_do(FALSE);
} while (!g_queue_is_empty(teco_interface.event_queue));
+ recursed = FALSE;
return TRUE;
}