Index: uspace/lib/display/include/disp_srv.h
===================================================================
--- uspace/lib/display/include/disp_srv.h	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/display/include/disp_srv.h	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2019 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -61,4 +61,5 @@
 	    gfx_coord2_t *);
 	errno_t (*window_move)(void *, sysarg_t, gfx_coord2_t *);
+	errno_t (*window_get_pos)(void *, sysarg_t, gfx_coord2_t *);
 	errno_t (*window_resize)(void *, sysarg_t, gfx_coord2_t *, gfx_rect_t *);
 	errno_t (*window_set_cursor)(void *, sysarg_t, display_stock_cursor_t);
Index: uspace/lib/display/include/display.h
===================================================================
--- uspace/lib/display/include/display.h	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/display/include/display.h	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2019 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -58,4 +58,5 @@
     display_wnd_rsztype_t, gfx_coord2_t *);
 extern errno_t display_window_move(display_window_t *, gfx_coord2_t *);
+extern errno_t display_window_get_pos(display_window_t *, gfx_coord2_t *);
 extern errno_t display_window_resize(display_window_t *,
     gfx_coord2_t *, gfx_rect_t *);
Index: uspace/lib/display/include/ipc/display.h
===================================================================
--- uspace/lib/display/include/ipc/display.h	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/display/include/ipc/display.h	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2019 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -44,4 +44,5 @@
 	DISPLAY_WINDOW_MOVE,
 	DISPLAY_WINDOW_MOVE_REQ,
+	DISPLAY_WINDOW_GET_POS,
 	DISPLAY_WINDOW_RESIZE,
 	DISPLAY_WINDOW_RESIZE_REQ,
Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/display/src/disp_srv.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2019 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -187,4 +187,47 @@
 }
 
+static void display_window_get_pos_srv(display_srv_t *srv, ipc_call_t *icall)
+{
+	sysarg_t wnd_id;
+	ipc_call_t call;
+	gfx_coord2_t dpos;
+	size_t size;
+	errno_t rc;
+
+	wnd_id = ipc_get_arg1(icall);
+
+	if (srv->ops->window_get_pos == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	if (!async_data_read_receive(&call, &size)) {
+		async_answer_0(icall, EREFUSED);
+		return;
+	}
+
+	rc = srv->ops->window_get_pos(srv->arg, wnd_id, &dpos);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	if (size != sizeof(gfx_coord2_t)) {
+		async_answer_0(&call, EINVAL);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	rc = async_data_read_finalize(&call, &dpos, size);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	async_answer_0(icall, EOK);
+}
+
 static void display_window_resize_req_srv(display_srv_t *srv, ipc_call_t *icall)
 {
@@ -398,4 +441,7 @@
 		case DISPLAY_WINDOW_MOVE:
 			display_window_move_srv(srv, &call);
+			break;
+		case DISPLAY_WINDOW_GET_POS:
+			display_window_get_pos_srv(srv, &call);
 			break;
 		case DISPLAY_WINDOW_RESIZE_REQ:
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/display/src/display.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2019 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -319,4 +319,35 @@
 }
 
+/** Get display window position.
+ *
+ * Get display window position on the display.
+ *
+ * @param window Window
+ * @param dpos Place to store position
+ * @return EOK on success or an error code
+ */
+errno_t display_window_get_pos(display_window_t *window, gfx_coord2_t *dpos)
+{
+	async_exch_t *exch;
+	aid_t req;
+	ipc_call_t answer;
+	errno_t rc;
+
+	exch = async_exchange_begin(window->display->sess);
+	req = async_send_1(exch, DISPLAY_WINDOW_GET_POS, window->id, &answer);
+	rc = async_data_read_start(exch, dpos, sizeof (gfx_coord2_t));
+	async_exchange_end(exch);
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+
+	async_wait_for(req, &rc);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
 /** Request a window resize.
  *
Index: uspace/lib/display/test/display.c
===================================================================
--- uspace/lib/display/test/display.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/display/test/display.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2019 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -59,4 +59,5 @@
 static errno_t test_window_move_req(void *, sysarg_t, gfx_coord2_t *);
 static errno_t test_window_move(void *, sysarg_t, gfx_coord2_t *);
+static errno_t test_window_get_pos(void *, sysarg_t, gfx_coord2_t *);
 static errno_t test_window_resize_req(void *, sysarg_t, display_wnd_rsztype_t,
     gfx_coord2_t *);
@@ -74,4 +75,5 @@
 	.window_move_req = test_window_move_req,
 	.window_move = test_window_move,
+	.window_get_pos = test_window_get_pos,
 	.window_resize_req = test_window_resize_req,
 	.window_resize = test_window_resize,
@@ -115,4 +117,8 @@
 	sysarg_t move_wnd_id;
 	gfx_coord2_t move_dpos;
+
+	bool window_get_pos_called;
+	sysarg_t get_pos_wnd_id;
+	gfx_coord2_t get_pos_rpos;
 
 	bool window_resize_req_called;
@@ -556,4 +562,116 @@
 }
 
+/** display_window_get_pos() with server returning error response works. */
+PCUT_TEST(window_get_pos_failure)
+{
+	errno_t rc;
+	service_id_t sid;
+	display_t *disp = NULL;
+	display_wnd_params_t params;
+	display_window_t *wnd;
+	gfx_coord2_t dpos;
+	test_response_t resp;
+
+	async_set_fallback_port_handler(test_display_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_display_server);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(test_display_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = display_open(test_display_svc, &disp);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(disp);
+
+	resp.rc = EOK;
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(wnd);
+
+	resp.rc = EIO;
+	resp.window_get_pos_called = false;
+
+	dpos.x = 0;
+	dpos.y = 0;
+
+	rc = display_window_get_pos(wnd, &dpos);
+	PCUT_ASSERT_TRUE(resp.window_get_pos_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+	PCUT_ASSERT_INT_EQUALS(wnd->id, resp.get_pos_wnd_id);
+	PCUT_ASSERT_INT_EQUALS(0, dpos.x);
+	PCUT_ASSERT_INT_EQUALS(0, dpos.y);
+
+	display_window_destroy(wnd);
+	display_close(disp);
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** display_window_get_pos() with server returning success response works. */
+PCUT_TEST(window_get_pos_success)
+{
+	errno_t rc;
+	service_id_t sid;
+	display_t *disp = NULL;
+	display_wnd_params_t params;
+	display_window_t *wnd;
+	gfx_coord2_t dpos;
+	test_response_t resp;
+
+	async_set_fallback_port_handler(test_display_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_display_server);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(test_display_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = display_open(test_display_svc, &disp);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(disp);
+
+	resp.rc = EOK;
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(wnd);
+
+	resp.rc = EOK;
+	resp.window_get_pos_called = false;
+	resp.get_pos_rpos.x = 11;
+	resp.get_pos_rpos.y = 12;
+
+	dpos.x = 0;
+	dpos.y = 0;
+
+	rc = display_window_get_pos(wnd, &dpos);
+	PCUT_ASSERT_TRUE(resp.window_get_pos_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+	PCUT_ASSERT_INT_EQUALS(wnd->id, resp.get_pos_wnd_id);
+	PCUT_ASSERT_INT_EQUALS(resp.get_pos_rpos.x, dpos.x);
+	PCUT_ASSERT_INT_EQUALS(resp.get_pos_rpos.y, dpos.y);
+
+	display_window_destroy(wnd);
+	display_close(disp);
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
 /** display_window_resize_req() with server returning error response works. */
 PCUT_TEST(window_resize_req_failure)
@@ -937,6 +1055,5 @@
 	resp.rc = ENOMEM;
 	rc = display_window_get_gc(wnd, &gc);
-	/* async_connect_me_to() does not return specific error */
-	PCUT_ASSERT_ERRNO_VAL(EIO, rc);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
 	PCUT_ASSERT_NULL(gc);
 
@@ -1589,4 +1706,17 @@
 }
 
+static errno_t test_window_get_pos(void *arg, sysarg_t wnd_id, gfx_coord2_t *dpos)
+{
+	test_response_t *resp = (test_response_t *) arg;
+
+	resp->window_get_pos_called = true;
+	resp->get_pos_wnd_id = wnd_id;
+
+	if (resp->rc == EOK)
+		*dpos = resp->get_pos_rpos;
+
+	return resp->rc;
+}
+
 static errno_t test_window_resize_req(void *arg, sysarg_t wnd_id,
     display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
Index: uspace/lib/ui/include/types/ui/window.h
===================================================================
--- uspace/lib/ui/include/types/ui/window.h	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/ui/include/types/ui/window.h	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -58,5 +58,7 @@
 	ui_wnd_place_bottom_right,
 	/** Place window accross the entire screen */
-	ui_wnd_place_full_screen
+	ui_wnd_place_full_screen,
+	/** Place window as a popup window adjacent to rectangle */
+	ui_wnd_place_popup
 } ui_wnd_placement_t;
 
@@ -71,4 +73,6 @@
 	/** Window placement */
 	ui_wnd_placement_t placement;
+	/** Parent rectangle for popup windows */
+	gfx_rect_t prect;
 } ui_wnd_params_t;
 
Index: uspace/lib/ui/include/ui/window.h
===================================================================
--- uspace/lib/ui/include/ui/window.h	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/ui/include/ui/window.h	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -57,4 +57,5 @@
 extern ui_resource_t *ui_window_get_res(ui_window_t *);
 extern gfx_context_t *ui_window_get_gc(ui_window_t *);
+extern errno_t ui_window_get_pos(ui_window_t *, gfx_coord2_t *);
 extern errno_t ui_window_get_app_gc(ui_window_t *, gfx_context_t **);
 extern void ui_window_get_app_rect(ui_window_t *, gfx_rect_t *);
Index: uspace/lib/ui/src/menu.c
===================================================================
--- uspace/lib/ui/src/menu.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/ui/src/menu.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -245,4 +245,5 @@
 	ui_popup_params_init(&params);
 	params.rect = geom.outer_rect;
+	params.place = *prect;
 
 	rc = ui_popup_create(menu->mbar->ui, menu->mbar->window, &params,
Index: uspace/lib/ui/src/popup.c
===================================================================
--- uspace/lib/ui/src/popup.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/ui/src/popup.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -78,4 +78,5 @@
 	ui_window_t *window = NULL;
 	ui_wnd_params_t wparams;
+	gfx_coord2_t parent_pos;
 	errno_t rc;
 
@@ -83,4 +84,8 @@
 	if (popup == NULL)
 		return ENOMEM;
+
+	rc = ui_window_get_pos(parent, &parent_pos);
+	if (rc != EOK)
+		goto error;
 
 	ui_wnd_params_init(&wparams);
@@ -88,4 +93,8 @@
 	wparams.caption = "";
 	wparams.style &= ~ui_wds_decorated;
+	wparams.placement = ui_wnd_place_popup;
+
+	/* Compute position of parent rectangle relative to the screen */
+	gfx_rect_translate(&parent_pos, &params->place, &wparams.prect);
 
 	rc = ui_window_create(ui, &wparams, &window);
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/lib/ui/src/window.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -109,4 +109,50 @@
 }
 
+static errno_t ui_window_place(ui_window_t *window, display_t *display,
+    display_info_t *info, ui_wnd_params_t *params)
+{
+	gfx_coord2_t pos;
+	errno_t rc;
+
+	assert(params->placement != ui_wnd_place_default);
+
+	pos.x = 0;
+	pos.y = 0;
+	switch (params->placement) {
+	case ui_wnd_place_default:
+		assert(false);
+	case ui_wnd_place_top_left:
+	case ui_wnd_place_full_screen:
+		pos.x = info->rect.p0.x - params->rect.p0.x;
+		pos.y = info->rect.p0.y - params->rect.p0.y;
+		break;
+	case ui_wnd_place_top_right:
+		pos.x = info->rect.p1.x - params->rect.p1.x;
+		pos.y = info->rect.p0.y - params->rect.p0.y;
+		break;
+	case ui_wnd_place_bottom_left:
+		pos.x = info->rect.p0.x - params->rect.p0.x;
+		pos.y = info->rect.p1.y - params->rect.p1.y;
+		break;
+	case ui_wnd_place_bottom_right:
+		pos.x = info->rect.p1.x - params->rect.p1.x;
+		pos.y = info->rect.p1.y - params->rect.p1.y;
+		break;
+	case ui_wnd_place_popup:
+		/* Place popup window below parent rectangle */
+		pos.x = params->prect.p0.x;
+		pos.y = params->prect.p1.y;
+		break;
+	}
+
+	rc = display_window_move(window->dwindow, &pos);
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	return rc;
+}
+
 /** Create new window.
  *
@@ -121,8 +167,6 @@
 	ui_window_t *window;
 	display_info_t info;
-	gfx_coord2_t pos;
 	gfx_coord2_t scr_dims;
 	display_wnd_params_t dparams;
-	display_window_t *dwindow = NULL;
 	gfx_context_t *gc = NULL;
 	ui_resource_t *res = NULL;
@@ -159,40 +203,16 @@
 
 		rc = display_window_create(ui->display, &dparams, &dwnd_cb,
-		    (void *) window, &dwindow);
+		    (void *) window, &window->dwindow);
 		if (rc != EOK)
 			goto error;
 
 		if (params->placement != ui_wnd_place_default) {
-			pos.x = 0;
-			pos.y = 0;
-
-			switch (params->placement) {
-			case ui_wnd_place_default:
-				assert(false);
-			case ui_wnd_place_top_left:
-			case ui_wnd_place_full_screen:
-				pos.x = info.rect.p0.x - params->rect.p0.x;
-				pos.y = info.rect.p0.y - params->rect.p0.y;
-				break;
-			case ui_wnd_place_top_right:
-				pos.x = info.rect.p1.x - params->rect.p1.x;
-				pos.y = info.rect.p0.y - params->rect.p0.y;
-				break;
-			case ui_wnd_place_bottom_left:
-				pos.x = info.rect.p0.x - params->rect.p0.x;
-				pos.y = info.rect.p1.y - params->rect.p1.y;
-				break;
-			case ui_wnd_place_bottom_right:
-				pos.x = info.rect.p1.x - params->rect.p1.x;
-				pos.y = info.rect.p1.y - params->rect.p1.y;
-				break;
-			}
-
-			rc = display_window_move(dwindow, &pos);
+			rc = ui_window_place(window, ui->display, &info,
+			    params);
 			if (rc != EOK)
 				goto error;
 		}
 
-		rc = display_window_get_gc(dwindow, &gc);
+		rc = display_window_get_gc(window->dwindow, &gc);
 		if (rc != EOK)
 			goto error;
@@ -265,5 +285,4 @@
 
 	window->ui = ui;
-	window->dwindow = dwindow;
 	window->rect = dparams.rect;
 
@@ -286,6 +305,4 @@
 	if (dgc != NULL)
 		dummygc_destroy(dgc);
-	if (dwindow != NULL)
-		display_window_destroy(dwindow);
 	free(window);
 	return rc;
@@ -536,4 +553,26 @@
 {
 	return window->gc;
+}
+
+/** Get window position.
+ *
+ * @param window Window
+ * @param pos Place to store position
+ * @return EOK on success or an error code
+ */
+errno_t ui_window_get_pos(ui_window_t *window, gfx_coord2_t *pos)
+{
+	errno_t rc;
+
+	if (window->dwindow != NULL) {
+		rc = display_window_get_pos(window->dwindow, pos);
+		if (rc != EOK)
+			return rc;
+	} else {
+		pos->x = 0;
+		pos->y = 0;
+	}
+
+	return EOK;
 }
 
Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/srv/hid/display/dsops.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -48,4 +48,5 @@
 static errno_t disp_window_move_req(void *, sysarg_t, gfx_coord2_t *);
 static errno_t disp_window_move(void *, sysarg_t, gfx_coord2_t *);
+static errno_t disp_window_get_pos(void *, sysarg_t, gfx_coord2_t *);
 static errno_t disp_window_resize_req(void *, sysarg_t,
     display_wnd_rsztype_t, gfx_coord2_t *);
@@ -61,4 +62,5 @@
 	.window_move_req = disp_window_move_req,
 	.window_move = disp_window_move,
+	.window_get_pos = disp_window_get_pos,
 	.window_resize_req = disp_window_resize_req,
 	.window_resize = disp_window_resize,
@@ -162,4 +164,24 @@
 }
 
+static errno_t disp_window_get_pos(void *arg, sysarg_t wnd_id,
+    gfx_coord2_t *pos)
+{
+	ds_client_t *client = (ds_client_t *) arg;
+	ds_window_t *wnd;
+
+	ds_display_lock(client->display);
+
+	wnd = ds_client_find_window(client, wnd_id);
+	if (wnd == NULL) {
+		ds_display_unlock(client->display);
+		return ENOENT;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "disp_window_get_pos()");
+	ds_window_get_pos(wnd, pos);
+	ds_display_unlock(client->display);
+	return EOK;
+}
+
 static errno_t disp_window_resize_req(void *arg, sysarg_t wnd_id,
     display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/srv/hid/display/window.c	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2019 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -658,4 +658,13 @@
 }
 
+/** Get window position.
+ *
+ * @param wnd Window
+ */
+void ds_window_get_pos(ds_window_t *wnd, gfx_coord2_t *dpos)
+{
+	*dpos = wnd->dpos;
+}
+
 /** Start resizing a window, detected by client.
  *
Index: uspace/srv/hid/display/window.h
===================================================================
--- uspace/srv/hid/display/window.h	(revision c68c18b9bb5f07126605a1631863634fac2f1ffb)
+++ uspace/srv/hid/display/window.h	(revision c9927c664d54127a7f3eb509f6129ebca2f158f1)
@@ -63,4 +63,5 @@
 extern void ds_window_move_req(ds_window_t *, gfx_coord2_t *);
 extern void ds_window_move(ds_window_t *, gfx_coord2_t *);
+extern void ds_window_get_pos(ds_window_t *, gfx_coord2_t *);
 extern void ds_window_resize_req(ds_window_t *, display_wnd_rsztype_t,
     gfx_coord2_t *);
