diff --git a/src/search.c b/src/search.c
index a7f19a7f715a98314bc0a47311319face49cfe10..24d6004edf38a32151b41a5492f4450b1b1c1125 100644
--- a/src/search.c
+++ b/src/search.c
@@ -294,6 +294,7 @@ int findnextstr(
 
 	    if (input && func_from_key(&input) == do_cancel) {
 		statusbar(_("Cancelled"));
+		disable_nodelay();
 		return -2;
 	    }
 
diff --git a/src/winio.c b/src/winio.c
index 5260a580d033941aacd76ca159b1dd4cc2a9ba8f..549a087fbc1ad2ab8ce7c87b0afaba120b792958 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -180,8 +180,9 @@ void get_key_buffer(WINDOW *win)
 	key_buffer[key_buffer_len - 1] = input;
     }
 
-    /* Switch back to waiting mode for input. */
-    nodelay(win, FALSE);
+    /* Restore waiting mode if it was on. */
+    if (!nodelay_mode)
+	nodelay(win, FALSE);
 
 #ifdef DEBUG
     {