Index: uspace/app/hello/hello.h
===================================================================
--- uspace/app/hello/hello.h	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/app/hello/hello.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -37,5 +37,4 @@
 #define HELLO_H
 
-#include <display.h>
 #include <ui/fixed.h>
 #include <ui/label.h>
Index: uspace/app/meson.build
===================================================================
--- uspace/app/meson.build	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/app/meson.build	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -78,4 +78,5 @@
 	'sbi',
 	'shutdown',
+	'shutdown-dlg',
 	'sportdmp',
 	'stats',
Index: uspace/app/shutdown-dlg/doc/doxygroups.h
===================================================================
--- uspace/app/shutdown-dlg/doc/doxygroups.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
+++ uspace/app/shutdown-dlg/doc/doxygroups.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -0,0 +1,4 @@
+/** @addtogroup shutdown-dlg shutdown-dlg
+ * @brief Shutdown dialog
+ * @ingroup apps
+ */
Index: uspace/app/shutdown-dlg/meson.build
===================================================================
--- uspace/app/shutdown-dlg/meson.build	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
+++ uspace/app/shutdown-dlg/meson.build	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2024 Jiri Svoboda
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+deps = [ 'system', 'ui' ]
+src = files(
+	'shutdown-dlg.c',
+)
Index: uspace/app/shutdown-dlg/shutdown-dlg.c
===================================================================
--- uspace/app/shutdown-dlg/shutdown-dlg.c	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
+++ uspace/app/shutdown-dlg/shutdown-dlg.c	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -0,0 +1,387 @@
+/*
+ * Copyright (c) 2024 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup shutdown-dlg
+ * @{
+ */
+/** @file Shutdown dialog
+ */
+
+#include <gfx/coord.h>
+#include <gfx/render.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <str.h>
+#include <system.h>
+#include <ui/fixed.h>
+#include <ui/label.h>
+#include <ui/resource.h>
+#include <ui/ui.h>
+#include <ui/window.h>
+#include "shutdown-dlg.h"
+
+static void wnd_close(ui_window_t *, void *);
+static errno_t bg_wnd_paint(ui_window_t *, void *);
+
+static ui_window_cb_t bg_window_cb = {
+	.close = wnd_close,
+	.paint = bg_wnd_paint
+};
+
+static ui_window_cb_t progress_window_cb = {
+	.close = wnd_close
+};
+
+static void sd_shutdown_complete(void *);
+static void sd_shutdown_failed(void *);
+
+static system_cb_t sd_system_cb = {
+	.shutdown_complete = sd_shutdown_complete,
+	.shutdown_failed = sd_shutdown_failed
+};
+
+/** System shutdown complete.
+ *
+ * @param arg Argument (shutdown_dlg_t *)
+ */
+static void sd_shutdown_complete(void *arg)
+{
+	shutdown_dlg_t *sddlg = (shutdown_dlg_t *)arg;
+
+	ui_lock(sddlg->ui);
+	(void)ui_label_set_text(sddlg->progress->label,
+	    "Shutdown complete. It is now safe to remove power.");
+	(void)ui_window_paint(sddlg->progress->window);
+	ui_unlock(sddlg->ui);
+}
+
+/** System shutdown failed.
+ *
+ * @param arg Argument (shutdown_dlg_t *)
+ */
+static void sd_shutdown_failed(void *arg)
+{
+	shutdown_dlg_t *sddlg = (shutdown_dlg_t *)arg;
+
+	ui_lock(sddlg->ui);
+	(void)ui_label_set_text(sddlg->progress->label, "Shutdown failed.");
+	(void)ui_window_paint(sddlg->progress->window);
+	ui_unlock(sddlg->ui);
+}
+
+/** Window close button was clicked.
+ *
+ * @param window Window
+ * @param arg Argument (shutdown_dlg_t *)
+ */
+static void wnd_close(ui_window_t *window, void *arg)
+{
+	(void)window;
+	(void)arg;
+}
+
+/** Paint background window.
+ *
+ * @param window Window
+ * @param arg Argument (shutdown_dlg_t *)
+ */
+static errno_t bg_wnd_paint(ui_window_t *window, void *arg)
+{
+	shutdown_dlg_t *sddlg = (shutdown_dlg_t *)arg;
+	gfx_rect_t app_rect;
+	gfx_context_t *gc;
+	errno_t rc;
+
+	gc = ui_window_get_gc(window);
+
+	rc = gfx_set_color(gc, sddlg->bg_color);
+	if (rc != EOK)
+		return rc;
+
+	ui_window_get_app_rect(window, &app_rect);
+
+	rc = gfx_fill_rect(gc, &app_rect);
+	if (rc != EOK)
+		return rc;
+
+	rc = gfx_update(gc);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
+/** Create shutdown progress window.
+ *
+ * @param sddlg Shutdown dialog
+ * @param rprogress Place to store pointer to new progress window
+ * @return EOK on success or an error code
+ */
+static errno_t shutdown_progress_create(shutdown_dlg_t *sddlg,
+    shutdown_progress_t **rprogress)
+{
+	ui_wnd_params_t params;
+	ui_window_t *window = NULL;
+	gfx_rect_t rect;
+	ui_resource_t *ui_res;
+	shutdown_progress_t *progress;
+	ui_fixed_t *fixed = NULL;
+	errno_t rc;
+
+	ui_wnd_params_init(&params);
+	params.caption = "Shut down";
+	params.style &= ~ui_wds_titlebar;
+	params.flags |= ui_wndf_topmost;
+	params.placement = ui_wnd_place_center;
+	if (ui_is_textmode(sddlg->ui)) {
+		params.rect.p0.x = 0;
+		params.rect.p0.y = 0;
+		params.rect.p1.x = 24;
+		params.rect.p1.y = 5;
+	} else {
+		params.rect.p0.x = 0;
+		params.rect.p0.y = 0;
+		params.rect.p1.x = 450;
+		params.rect.p1.y = 60;
+	}
+
+	progress = calloc(1, sizeof(shutdown_progress_t));
+	if (progress == NULL) {
+		rc = ENOMEM;
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	rc = ui_window_create(sddlg->ui, &params, &window);
+	if (rc != EOK) {
+		printf("Error creating window.\n");
+		goto error;
+	}
+
+	ui_window_set_cb(window, &progress_window_cb, (void *) &sddlg);
+
+	ui_res = ui_window_get_res(window);
+
+	rc = ui_fixed_create(&fixed);
+	if (rc != EOK) {
+		printf("Error creating fixed layout.\n");
+		goto error;
+	}
+
+	rc = ui_label_create(ui_res, "The system is shutting down...",
+	    &progress->label);
+	if (rc != EOK) {
+		printf("Error creating label.\n");
+		goto error;
+	}
+
+	ui_window_get_app_rect(window, &rect);
+	ui_label_set_rect(progress->label, &rect);
+	ui_label_set_halign(progress->label, gfx_halign_center);
+	ui_label_set_valign(progress->label, gfx_valign_center);
+
+	rc = ui_fixed_add(fixed, ui_label_ctl(progress->label));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		ui_label_destroy(progress->label);
+		progress->label = NULL;
+		goto error;
+	}
+
+	ui_window_add(window, ui_fixed_ctl(fixed));
+	fixed = NULL;
+
+	rc = ui_window_paint(window);
+	if (rc != EOK) {
+		printf("Error painting window.\n");
+		goto error;
+	}
+
+	progress->window = window;
+	progress->fixed = fixed;
+	*rprogress = progress;
+	return EOK;
+error:
+	if (progress != NULL && progress->fixed != NULL)
+		ui_fixed_destroy(progress->fixed);
+	if (window != NULL)
+		ui_window_destroy(window);
+	if (progress != NULL)
+		free(progress);
+	return rc;
+}
+
+/** Destroy shutdown progress window.
+ *
+ * @param sddlg Shutdown dialog
+ * @param rprogress Place to store pointer to new progress window
+ * @return EOK on success or an error code
+ */
+static void shutdown_progress_destroy(shutdown_progress_t *progress)
+{
+	ui_window_destroy(progress->window);
+	free(progress);
+}
+
+/** Run shutdown dialog on display. */
+static errno_t shutdown_dlg(const char *display_spec)
+{
+	ui_t *ui = NULL;
+	ui_wnd_params_t params;
+	ui_window_t *window = NULL;
+	shutdown_dlg_t sddlg;
+	errno_t rc;
+
+	memset((void *) &sddlg, 0, sizeof(sddlg));
+
+	rc = ui_create(display_spec, &ui);
+	if (rc != EOK) {
+		printf("Error creating UI on display %s.\n", display_spec);
+		goto error;
+	}
+
+	ui_wnd_params_init(&params);
+	params.caption = "Shut down background";
+	params.style &= ~ui_wds_decorated;
+	params.placement = ui_wnd_place_full_screen;
+	params.flags |= ui_wndf_topmost | ui_wndf_nofocus;
+	if (ui_is_textmode(ui)) {
+		params.rect.p0.x = 0;
+		params.rect.p0.y = 0;
+		params.rect.p1.x = 24;
+		params.rect.p1.y = 5;
+	} else {
+		params.rect.p0.x = 0;
+		params.rect.p0.y = 0;
+		params.rect.p1.x = 300;
+		params.rect.p1.y = 60;
+	}
+
+	sddlg.ui = ui;
+
+	rc = ui_window_create(ui, &params, &window);
+	if (rc != EOK) {
+		printf("Error creating window.\n");
+		goto error;
+	}
+
+	ui_window_set_cb(window, &bg_window_cb, (void *) &sddlg);
+	sddlg.bgwindow = window;
+
+	rc = gfx_color_new_rgb_i16(0x8000, 0xc800, 0xffff, &sddlg.bg_color);
+	if (rc != EOK) {
+		printf("Error allocating color.\n");
+		goto error;
+	}
+
+	rc = ui_window_paint(window);
+	if (rc != EOK) {
+		printf("Error painting window.\n");
+		goto error;
+	}
+
+	rc = shutdown_progress_create(&sddlg, &sddlg.progress);
+	if (rc != EOK)
+		return rc;
+
+	rc = system_open(SYSTEM_DEFAULT, &sd_system_cb, &sddlg, &sddlg.system);
+	if (rc != EOK) {
+		printf("Failed opening system control service.\n");
+		goto error;
+	}
+
+	rc = system_shutdown(sddlg.system);
+	if (rc != EOK) {
+		printf("Failed requesting system shutdown.\n");
+		goto error;
+	}
+
+	ui_run(ui);
+
+	shutdown_progress_destroy(sddlg.progress);
+	ui_window_destroy(window);
+	system_close(sddlg.system);
+	gfx_color_delete(sddlg.bg_color);
+	ui_destroy(ui);
+
+	return EOK;
+error:
+	if (sddlg.system != NULL)
+		system_close(sddlg.system);
+	if (sddlg.bg_color != NULL)
+		gfx_color_delete(sddlg.bg_color);
+	if (window != NULL)
+		ui_window_destroy(window);
+	if (ui != NULL)
+		ui_destroy(ui);
+	return rc;
+}
+
+static void print_syntax(void)
+{
+	printf("Syntax: shutdown-dlg [-d <display-spec>]\n");
+}
+
+int main(int argc, char *argv[])
+{
+	const char *display_spec = UI_ANY_DEFAULT;
+	errno_t rc;
+	int i;
+
+	i = 1;
+	while (i < argc && argv[i][0] == '-') {
+		if (str_cmp(argv[i], "-d") == 0) {
+			++i;
+			if (i >= argc) {
+				printf("Argument missing.\n");
+				print_syntax();
+				return 1;
+			}
+
+			display_spec = argv[i++];
+		} else {
+			printf("Invalid option '%s'.\n", argv[i]);
+			print_syntax();
+			return 1;
+		}
+	}
+
+	if (i < argc) {
+		print_syntax();
+		return 1;
+	}
+
+	rc = shutdown_dlg(display_spec);
+	if (rc != EOK)
+		return 1;
+
+	return 0;
+}
+
+/** @}
+ */
Index: uspace/app/shutdown-dlg/shutdown-dlg.h
===================================================================
--- uspace/app/shutdown-dlg/shutdown-dlg.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
+++ uspace/app/shutdown-dlg/shutdown-dlg.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2024 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup hello
+ * @{
+ */
+/**
+ * @file Shutdown dialog
+ */
+
+#ifndef SHUTDOWN_DLG_H
+#define SHUTDOWN_DLG_H
+
+#include <gfx/color.h>
+#include <system.h>
+#include <ui/fixed.h>
+#include <ui/label.h>
+#include <ui/ui.h>
+#include <ui/window.h>
+
+/** Shutdown progress window. */
+typedef struct {
+	ui_window_t *window;
+	ui_fixed_t *fixed;
+	ui_label_t *label;
+} shutdown_progress_t;
+
+/** Shutdown dialog. */
+typedef struct {
+	ui_t *ui;
+	ui_window_t *bgwindow;
+	gfx_color_t *bg_color;
+	shutdown_progress_t *progress;
+	system_t *system;
+} shutdown_dlg_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/app/shutdown/shutdown.c
===================================================================
--- uspace/app/shutdown/shutdown.c	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/app/shutdown/shutdown.c	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -105,5 +105,6 @@
 	}
 
-	rc = nchoice_set_prompt(nchoice, "Select action");
+	rc = nchoice_set_prompt(nchoice, "Do you want to shut the system down? "
+	    "Select action:");
 	if (rc != EOK) {
 		printf(NAME ": Out of memory.\n");
@@ -194,5 +195,5 @@
 
 	fibril_mutex_lock(&shutdown.lock);
-	printf("System is shutting down...\n");
+	printf("The system is shutting down...\n");
 	while (!shutdown.stopped)
 		fibril_condvar_wait(&shutdown.cv, &shutdown.lock);
Index: uspace/lib/display/include/types/display/wndparams.h
===================================================================
--- uspace/lib/display/include/types/display/wndparams.h	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/lib/display/include/types/display/wndparams.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -42,16 +42,18 @@
 	/** Popup window (capture events, no focus) */
 	wndf_popup = 0x1,
+	/** Window does not receive focus */
+	wndf_nofocus = 0x2,
 	/** Topmost window */
-	wndf_topmost = 0x2,
+	wndf_topmost = 0x4,
 	/** Set specific initial window position */
-	wndf_setpos = 0x4,
+	wndf_setpos = 0x8,
 	/** Window is minimized */
-	wndf_minimized = 0x8,
+	wndf_minimized = 0x10,
 	/** Window is maximized */
-	wndf_maximized = 0x10,
+	wndf_maximized = 0x20,
 	/** Special system window */
-	wndf_system = 0x20,
+	wndf_system = 0x40,
 	/** Maximized windows should avoid this window */
-	wndf_avoid = 0x40
+	wndf_avoid = 0x80
 } display_wnd_flags_t;
 
Index: uspace/lib/ui/include/types/ui/window.h
===================================================================
--- uspace/lib/ui/include/types/ui/window.h	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/lib/ui/include/types/ui/window.h	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -58,4 +58,6 @@
 	/** Place window to the bottom-right corner of the screen */
 	ui_wnd_place_bottom_right,
+	/** Place window to the center of the screen */
+	ui_wnd_place_center,
 	/** Place window accross the entire screen */
 	ui_wnd_place_full_screen,
@@ -68,10 +70,12 @@
 	/** Popup window */
 	ui_wndf_popup = 0x1,
+	/** Window does not receive focus */
+	ui_wndf_nofocus = 0x2,
 	/** Topmost window */
-	ui_wndf_topmost = 0x2,
+	ui_wndf_topmost = 0x4,
 	/** Special system window */
-	ui_wndf_system = 0x4,
+	ui_wndf_system = 0x8,
 	/** Maximized windows should avoid this window */
-	ui_wndf_avoid = 0x8
+	ui_wndf_avoid = 0x10
 } ui_wnd_flags_t;
 
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/lib/ui/src/window.c	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -189,5 +189,7 @@
 	switch (params->placement) {
 	case ui_wnd_place_default:
-		assert(ui_is_fullscreen(window->ui));
+	case ui_wnd_place_center:
+		assert(params->placement != ui_wnd_place_default ||
+		    ui_is_fullscreen(window->ui));
 		/* Center window */
 		gfx_rect_dims(&params->rect, &dims);
@@ -357,4 +359,6 @@
 	if ((params->flags & ui_wndf_popup) != 0)
 		dparams.flags |= wndf_popup;
+	if ((params->flags & ui_wndf_nofocus) != 0)
+		dparams.flags |= wndf_nofocus;
 	if ((params->flags & ui_wndf_topmost) != 0)
 		dparams.flags |= wndf_topmost;
Index: uspace/srv/hid/display/seat.c
===================================================================
--- uspace/srv/hid/display/seat.c	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/srv/hid/display/seat.c	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -492,5 +492,6 @@
 	/* Focus window on button press */
 	if (event->type == PTD_PRESS && event->btn_num == 1) {
-		if (wnd != NULL && (wnd->flags & wndf_popup) == 0) {
+		if (wnd != NULL && (wnd->flags & wndf_popup) == 0 &&
+		    (wnd->flags & wndf_nofocus) == 0) {
 			ds_seat_set_focus(seat, wnd);
 		}
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision ad9e2257215db1d8451e4a51b25573aa07918d4b)
+++ uspace/srv/hid/display/window.c	(revision 0d00e53ee0e707747c5d846467b5eddfa7a0e101)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -153,8 +153,10 @@
 
 	/* Is this a popup window? */
-	if ((params->flags & wndf_popup) != 0)
+	if ((params->flags & wndf_popup) != 0) {
 		ds_seat_set_popup(seat, wnd);
-	else
-		ds_seat_set_focus(seat, wnd);
+	} else {
+		if ((params->flags & wndf_nofocus) == 0)
+			ds_seat_set_focus(seat, wnd);
+	}
 
 	/* Is this window a panel? */
