diff --git a/compositor/compositor.c b/compositor/compositor.c
index 53b282a..97d665a 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -1343,10 +1343,20 @@ wlsc_compositor_wake(struct wlsc_compositor *compositor)
 				     option_idle_time * 1000);
 }
 
+WL_EXPORT void
+wlsc_compositor_activity(struct wlsc_compositor *compositor)
+{
+	if (compositor->state != WLSC_COMPOSITOR_SLEEPING) {
+		wlsc_compositor_wake(compositor);
+	} else {
+		compositor->shell->unlock(compositor->shell);
+	}
+}
+
 static void
 wlsc_compositor_idle_inhibit(struct wlsc_compositor *compositor)
 {
-	wlsc_compositor_wake(compositor);
+	wlsc_compositor_activity(compositor);
 	compositor->idle_inhibit++;
 }
 
@@ -1354,7 +1364,7 @@ static void
 wlsc_compositor_idle_release(struct wlsc_compositor *compositor)
 {
 	compositor->idle_inhibit--;
-	wlsc_compositor_wake(compositor);
+	wlsc_compositor_activity(compositor);
 }
 
 static int
@@ -1383,7 +1393,7 @@ notify_motion(struct wl_input_device *device, uint32_t time, int x, int y)
 	int x_valid = 0, y_valid = 0;
 	int min_x = INT_MAX, min_y = INT_MAX, max_x = INT_MIN, max_y = INT_MIN;
 
-	wlsc_compositor_wake(ec);
+	wlsc_compositor_activity(ec);
 
 	wl_list_for_each(output, &ec->output_list, link) {
 		if (output->x <= x && x <= output->x + output->current->width)
