Index: uspace/lib/display/include/display.h
===================================================================
--- uspace/lib/display/include/display.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
+++ uspace/lib/display/include/display.h	(revision 4ef27ebf98a0656e09889b7d00efdec03343f1aa)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -48,4 +48,6 @@
 extern errno_t display_open(const char *, display_t **);
 extern void display_close(display_t *);
+extern void display_lock(display_t *);
+extern void display_unlock(display_t *);
 extern errno_t display_get_info(display_t *, display_info_t *);
 
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
+++ uspace/lib/display/src/display.c	(revision 4ef27ebf98a0656e09889b7d00efdec03343f1aa)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -138,4 +138,26 @@
 }
 
+/*
+ * Lock display.
+ *
+ * While display is locked, display event handlers will not be called.
+ *
+ * @param display Display
+ */
+void display_lock(display_t *display)
+{
+	fibril_mutex_lock(&display->lock);
+}
+
+/*
+ * Unlock display.
+ *
+ * @param display Display
+ */
+void display_unlock(display_t *display)
+{
+	fibril_mutex_unlock(&display->lock);
+}
+
 /** Initialize window parameters structure.
  *
@@ -700,13 +722,11 @@
 	display_wnd_ev_t event;
 
+	display_lock(display);
+
 	while (true) {
-		fibril_mutex_lock(&display->lock);
-
 		if (display->sess != NULL)
 			rc = display_get_event(display, &window, &event);
 		else
 			rc = ENOENT;
-
-		fibril_mutex_unlock(&display->lock);
 
 		if (rc != EOK)
@@ -752,4 +772,5 @@
 	}
 
+	display_unlock(display);
 	async_answer_0(icall, EOK);
 }
