Index: uspace/app/launcher/launcher.c
===================================================================
--- uspace/app/launcher/launcher.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/app/launcher/launcher.c	(revision f43d8cef17ca84bb86ea598fe7053f90fc5d9fa0)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * Copyright (c) 2012 Petr Koupy
  * All rights reserved.
@@ -59,7 +59,9 @@
 
 static void wnd_close(ui_window_t *, void *);
+static void wnd_pos(ui_window_t *, void *, pos_event_t *);
 
 static ui_window_cb_t window_cb = {
-	.close = wnd_close
+	.close = wnd_close,
+	.pos = wnd_pos
 };
 
@@ -70,5 +72,5 @@
 };
 
-static int app_launchl(const char *, ...);
+static int app_launchl(launcher_t *, const char *, ...);
 
 /** Window close button was clicked.
@@ -84,4 +86,20 @@
 }
 
+/** Window received position event.
+ *
+ * @param window Window
+ * @param arg Argument (launcher)
+ * @param event Position event
+ */
+static void wnd_pos(ui_window_t *window, void *arg, pos_event_t *event)
+{
+	launcher_t *launcher = (launcher_t *) arg;
+
+	/* Remember ID of device that sent the last event */
+	launcher->ev_pos_id = event->pos_id;
+
+	ui_window_def_pos(window, event);
+}
+
 /** Push button was clicked.
  *
@@ -94,19 +112,19 @@
 
 	if (pbutton == launcher->pb1) {
-		app_launchl("/app/terminal", "-c", "/app/nav", NULL);
+		app_launchl(launcher, "/app/terminal", "-c", "/app/nav", NULL);
 	} else if (pbutton == launcher->pb2) {
-		app_launchl("/app/terminal", "-c", "/app/edit", NULL);
+		app_launchl(launcher, "/app/terminal", "-c", "/app/edit", NULL);
 	} else if (pbutton == launcher->pb3) {
-		app_launchl("/app/terminal", NULL);
+		app_launchl(launcher, "/app/terminal", NULL);
 	} else if (pbutton == launcher->pb4) {
-		app_launchl("/app/calculator", NULL);
+		app_launchl(launcher, "/app/calculator", NULL);
 	} else if (pbutton == launcher->pb5) {
-		app_launchl("/app/uidemo", NULL);
+		app_launchl(launcher, "/app/uidemo", NULL);
 	} else if (pbutton == launcher->pb6) {
-		app_launchl("/app/gfxdemo", "ui", NULL);
-	}
-}
-
-static int app_launchl(const char *app, ...)
+		app_launchl(launcher, "/app/gfxdemo", "ui", NULL);
+	}
+}
+
+static int app_launchl(launcher_t *launcher, const char *app, ...)
 {
 	errno_t rc;
@@ -117,6 +135,8 @@
 	const char **argv;
 	const char **argp;
+	char *dspec;
 	int cnt = 0;
 	int i;
+	int rv;
 
 	va_start(ap, app);
@@ -137,8 +157,14 @@
 	*argp++ = app;
 
-	if (str_cmp(display_spec, UI_DISPLAY_DEFAULT) != 0) {
-		*argp++ = "-d";
-		*argp++ = display_spec;
-	}
+	rv = asprintf(&dspec, "%s?idev=%zu", display_spec,
+	    (size_t)launcher->ev_pos_id);
+	if (rv < 0) {
+		printf("Out of memory.\n");
+		return -1;
+	}
+
+	/* TODO Might be omitted if default display AND only one seat */
+	*argp++ = "-d";
+	*argp++ = dspec;
 
 	va_start(ap, app);
@@ -192,4 +218,6 @@
 	gfx_rect_t rect;
 	gfx_coord2_t off;
+	const char *dspec = UI_DISPLAY_DEFAULT;
+	char *qmark;
 	errno_t rc;
 
@@ -204,5 +232,5 @@
 			}
 
-			display_spec = argv[i++];
+			dspec = argv[i++];
 		} else {
 			printf("Invalid option '%s'.\n", argv[i]);
@@ -212,5 +240,16 @@
 	}
 
-	rc = ui_create(display_spec, &ui);
+	display_spec = str_dup(dspec);
+	if (display_spec == NULL) {
+		printf("Out of memory.\n");
+		return 1;
+	}
+
+	/* Remove additional arguments */
+	qmark = str_chr(display_spec, '?');
+	if (qmark != NULL)
+		*qmark = '\0';
+
+	rc = ui_create(dspec, &ui);
 	if (rc != EOK) {
 		printf("Error creating UI on display %s.\n", display_spec);
Index: uspace/app/launcher/launcher.h
===================================================================
--- uspace/app/launcher/launcher.h	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/app/launcher/launcher.h	(revision f43d8cef17ca84bb86ea598fe7053f90fc5d9fa0)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -38,4 +38,5 @@
 
 #include <display.h>
+#include <types/common.h>
 #include <ui/fixed.h>
 #include <ui/image.h>
@@ -50,6 +51,8 @@
 	ui_window_t *window;
 	ui_fixed_t *fixed;
+
 	ui_image_t *image;
 	ui_label_t *label;
+
 	ui_pbutton_t *pb1;
 	ui_pbutton_t *pb2;
@@ -58,4 +61,7 @@
 	ui_pbutton_t *pb5;
 	ui_pbutton_t *pb6;
+
+	/** ID of device that sent last position event */
+	sysarg_t ev_pos_id;
 } launcher_t;
 
