Index: uspace/lib/display/include/disp_srv.h
===================================================================
--- uspace/lib/display/include/disp_srv.h	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/lib/display/include/disp_srv.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -41,4 +41,5 @@
 #include "display/wndparams.h"
 #include "types/display/event.h"
+#include "types/display/info.h"
 #include "types/display/wndresize.h"
 
@@ -60,4 +61,5 @@
 	errno_t (*window_resize)(void *, sysarg_t, gfx_coord2_t *, gfx_rect_t *);
 	errno_t (*get_event)(void *, sysarg_t *, display_wnd_ev_t *);
+	errno_t (*get_info)(void *, display_info_t *);
 };
 
Index: uspace/lib/display/include/display.h
===================================================================
--- uspace/lib/display/include/display.h	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/lib/display/include/display.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -43,7 +43,10 @@
 #include "display/wndresize.h"
 #include "types/display.h"
+#include "types/display/info.h"
 
 extern errno_t display_open(const char *, display_t **);
 extern void display_close(display_t *);
+extern errno_t display_get_info(display_t *, display_info_t *);
+
 extern errno_t display_window_create(display_t *, display_wnd_params_t *,
     display_wnd_cb_t *, void *, display_window_t **);
Index: uspace/lib/display/include/display/info.h
===================================================================
--- uspace/lib/display/include/display/info.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
+++ uspace/lib/display/include/display/info.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2020 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 libdisplay
+ * @{
+ */
+/** @file
+ */
+
+#ifndef _LIBDISPLAY_DISPLAY_INFO_H_
+#define _LIBDISPLAY_DISPLAY_INFO_H_
+
+#include <types/display/info.h>
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/display/include/ipc/display.h
===================================================================
--- uspace/lib/display/include/ipc/display.h	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/lib/display/include/ipc/display.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -45,5 +45,6 @@
 	DISPLAY_WINDOW_RESIZE,
 	DISPLAY_WINDOW_RESIZE_REQ,
-	DISPLAY_GET_EVENT
+	DISPLAY_GET_EVENT,
+	DISPLAY_GET_INFO
 } display_request_t;
 
Index: uspace/lib/display/include/types/display/info.h
===================================================================
--- uspace/lib/display/include/types/display/info.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
+++ uspace/lib/display/include/types/display/info.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2020 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 libdisplay
+ * @{
+ */
+/** @file
+ */
+
+#ifndef _LIBDISPLAY_TYPES_DISPLAY_INFO_H_
+#define _LIBDISPLAY_TYPES_DISPLAY_INFO_H_
+
+#include <gfx/coord.h>
+
+/** Display information */
+typedef struct {
+	/** Display bounding rectangle */
+	gfx_rect_t rect;
+} display_info_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/lib/display/src/disp_srv.c	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -37,4 +37,5 @@
 #include <disp_srv.h>
 #include <display/event.h>
+#include <display/info.h>
 #include <display/wndresize.h>
 #include <errno.h>
@@ -268,4 +269,45 @@
 }
 
+static void display_get_info_srv(display_srv_t *srv, ipc_call_t *icall)
+{
+	display_info_t info;
+	ipc_call_t call;
+	size_t size;
+	errno_t rc;
+
+	if (srv->ops->get_info == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	/* Transfer information */
+	if (!async_data_read_receive(&call, &size)) {
+		async_answer_0(icall, EREFUSED);
+		return;
+	}
+
+	if (size != sizeof(info)) {
+		async_answer_0(icall, EREFUSED);
+		async_answer_0(&call, EREFUSED);
+		return;
+	}
+
+	rc = srv->ops->get_info(srv->arg, &info);
+	if (rc != EOK) {
+		async_answer_0(icall, rc);
+		async_answer_0(&call, rc);
+		return;
+	}
+
+	rc = async_data_read_finalize(&call, &info, sizeof(info));
+	if (rc != EOK) {
+		async_answer_0(icall, rc);
+		async_answer_0(&call, rc);
+		return;
+	}
+
+	async_answer_0(icall, EOK);
+}
+
 void display_conn(ipc_call_t *icall, display_srv_t *srv)
 {
@@ -306,4 +348,7 @@
 		case DISPLAY_GET_EVENT:
 			display_get_event_srv(srv, &call);
+			break;
+		case DISPLAY_GET_INFO:
+			display_get_info_srv(srv, &call);
 			break;
 		default:
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/lib/display/src/display.c	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -385,5 +385,5 @@
  *
  * @param display Display
- * @param rwindow Place to store pointe to window that received event
+ * @param rwindow Place to store pointer to window that received event
  * @param event Place to store event
  * @return EOK on success or an error code
@@ -418,4 +418,33 @@
 
 	*rwindow = window;
+	return EOK;
+}
+
+/** Get display information.
+ *
+ * @param display Display
+ * @param info Place to store display information
+ * @return EOK on success or an error code
+ */
+errno_t display_get_info(display_t *display, display_info_t *info)
+{
+	async_exch_t *exch;
+	ipc_call_t answer;
+	aid_t req;
+	errno_t rc;
+
+	exch = async_exchange_begin(display->sess);
+	req = async_send_0(exch, DISPLAY_GET_INFO, &answer);
+	rc = async_data_read_start(exch, info, sizeof(*info));
+	async_exchange_end(exch);
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+
+	async_wait_for(req, &rc);
+	if (rc != EOK)
+		return rc;
+
 	return EOK;
 }
Index: uspace/lib/display/test/display.c
===================================================================
--- uspace/lib/display/test/display.c	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/lib/display/test/display.c	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -62,4 +62,5 @@
     gfx_rect_t *);
 static errno_t test_get_event(void *, sysarg_t *, display_wnd_ev_t *);
+static errno_t test_get_info(void *, display_info_t *);
 
 static errno_t test_gc_set_color(void *, gfx_color_t *);
@@ -71,5 +72,6 @@
 	.window_resize_req = test_window_resize_req,
 	.window_resize = test_window_resize,
-	.get_event = test_get_event
+	.get_event = test_get_event,
+	.get_info = test_get_info
 };
 
@@ -116,4 +118,8 @@
 
 	bool get_event_called;
+
+	bool get_info_called;
+	gfx_rect_t get_info_rect;
+
 	bool set_color_called;
 	bool close_event_called;
@@ -831,5 +837,5 @@
 
 	/* Verify that the event was delivered correctly */
-	PCUT_ASSERT_EQUALS(resp.event.etype,
+	PCUT_ASSERT_INT_EQUALS(resp.event.etype,
 	    resp.revent.etype);
 
@@ -896,5 +902,5 @@
 
 	/* Verify that the event was delivered correctly */
-	PCUT_ASSERT_EQUALS(resp.event.etype,
+	PCUT_ASSERT_INT_EQUALS(resp.event.etype,
 	    resp.revent.etype);
 
@@ -965,13 +971,13 @@
 
 	/* Verify that the event was delivered correctly */
-	PCUT_ASSERT_EQUALS(resp.event.etype,
+	PCUT_ASSERT_INT_EQUALS(resp.event.etype,
 	    resp.revent.etype);
-	PCUT_ASSERT_EQUALS(resp.event.ev.kbd.type,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.kbd.type,
 	    resp.revent.ev.kbd.type);
-	PCUT_ASSERT_EQUALS(resp.event.ev.kbd.key,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.kbd.key,
 	    resp.revent.ev.kbd.key);
-	PCUT_ASSERT_EQUALS(resp.event.ev.kbd.mods,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.kbd.mods,
 	    resp.revent.ev.kbd.mods);
-	PCUT_ASSERT_EQUALS(resp.event.ev.kbd.c,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.kbd.c,
 	    resp.revent.ev.kbd.c);
 
@@ -1042,13 +1048,13 @@
 
 	/* Verify that the event was delivered correctly */
-	PCUT_ASSERT_EQUALS(resp.event.etype,
+	PCUT_ASSERT_INT_EQUALS(resp.event.etype,
 	    resp.revent.etype);
-	PCUT_ASSERT_EQUALS(resp.event.ev.pos.type,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.pos.type,
 	    resp.revent.ev.pos.type);
-	PCUT_ASSERT_EQUALS(resp.event.ev.pos.btn_num,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.pos.btn_num,
 	    resp.revent.ev.pos.btn_num);
-	PCUT_ASSERT_EQUALS(resp.event.ev.pos.hpos,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.pos.hpos,
 	    resp.revent.ev.pos.hpos);
-	PCUT_ASSERT_EQUALS(resp.event.ev.pos.vpos,
+	PCUT_ASSERT_INT_EQUALS(resp.event.ev.pos.vpos,
 	    resp.revent.ev.pos.vpos);
 
@@ -1102,5 +1108,5 @@
 	resp.event.etype = wev_unfocus;
 	resp.wnd_id = wnd->id;
-	resp.focus_event_called = false;
+	resp.unfocus_event_called = false;
 	fibril_mutex_initialize(&resp.event_lock);
 	fibril_condvar_initialize(&resp.event_cv);
@@ -1115,5 +1121,5 @@
 
 	/* Verify that the event was delivered correctly */
-	PCUT_ASSERT_EQUALS(resp.event.etype,
+	PCUT_ASSERT_INT_EQUALS(resp.event.etype,
 	    resp.revent.etype);
 
@@ -1123,4 +1129,80 @@
 	display_close(disp);
 
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** display_get_info() with server returning failure response works. */
+PCUT_TEST(get_info_failure)
+{
+	errno_t rc;
+	service_id_t sid;
+	display_t *disp = NULL;
+	display_info_t info;
+	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 = ENOMEM;
+	resp.get_info_called = false;
+
+	rc = display_get_info(disp, &info);
+	PCUT_ASSERT_TRUE(resp.get_info_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+
+	display_close(disp);
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** display_get_info() with server returning success response works. */
+PCUT_TEST(get_info_success)
+{
+	errno_t rc;
+	service_id_t sid;
+	display_t *disp = NULL;
+	display_info_t info;
+	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;
+	resp.get_info_called = false;
+	resp.get_info_rect.p0.x = 10;
+	resp.get_info_rect.p0.y = 11;
+	resp.get_info_rect.p1.x = 20;
+	resp.get_info_rect.p1.y = 21;
+
+	rc = display_get_info(disp, &info);
+	PCUT_ASSERT_TRUE(resp.get_info_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+	PCUT_ASSERT_INT_EQUALS(resp.get_info_rect.p0.x, info.rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(resp.get_info_rect.p0.y, info.rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(resp.get_info_rect.p1.x, info.rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(resp.get_info_rect.p1.y, info.rect.p1.y);
+
+	display_close(disp);
 	rc = loc_service_unregister(sid);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -1294,5 +1376,6 @@
 }
 
-static errno_t test_get_event(void *arg, sysarg_t *wnd_id, display_wnd_ev_t *event)
+static errno_t test_get_event(void *arg, sysarg_t *wnd_id,
+    display_wnd_ev_t *event)
 {
 	test_response_t *resp = (test_response_t *) arg;
@@ -1309,4 +1392,14 @@
 }
 
+static errno_t test_get_info(void *arg, display_info_t *info)
+{
+	test_response_t *resp = (test_response_t *) arg;
+
+	resp->get_info_called = true;
+	info->rect = resp->get_info_rect;
+
+	return resp->rc;
+}
+
 static errno_t test_gc_set_color(void *arg, gfx_color_t *color)
 {
Index: uspace/srv/hid/display/display.c
===================================================================
--- uspace/srv/hid/display/display.c	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/srv/hid/display/display.c	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -84,4 +84,13 @@
 	gfx_color_delete(disp->bg_color);
 	free(disp);
+}
+
+/** Get display information.
+ *
+ * @param disp Display
+ */
+void ds_display_get_info(ds_display_t *disp, display_info_t *info)
+{
+	info->rect = disp->rect;
 }
 
Index: uspace/srv/hid/display/display.h
===================================================================
--- uspace/srv/hid/display/display.h	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/srv/hid/display/display.h	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -37,4 +37,5 @@
 #define DISPLAY_H
 
+#include <display/info.h>
 #include <errno.h>
 #include <gfx/context.h>
@@ -49,4 +50,5 @@
 extern errno_t ds_display_create(gfx_context_t *, ds_display_t **);
 extern void ds_display_destroy(ds_display_t *);
+extern void ds_display_get_info(ds_display_t *, display_info_t *);
 extern void ds_display_add_client(ds_display_t *, ds_client_t *);
 extern void ds_display_remove_client(ds_client_t *);
Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision 1a1271dfaa2121286470b22326ac39b1f42e1354)
+++ uspace/srv/hid/display/dsops.c	(revision aeb3037d16d12acc9017b38f10b453340424417d)
@@ -52,4 +52,5 @@
     gfx_rect_t *);
 static errno_t disp_get_event(void *, sysarg_t *, display_wnd_ev_t *);
+static errno_t disp_get_info(void *, display_info_t *);
 
 display_ops_t display_srv_ops = {
@@ -59,5 +60,6 @@
 	.window_resize_req = disp_window_resize_req,
 	.window_resize = disp_window_resize,
-	.get_event = disp_get_event
+	.get_event = disp_get_event,
+	.get_info = disp_get_info
 };
 
@@ -168,4 +170,14 @@
 }
 
+static errno_t disp_get_info(void *arg, display_info_t *info)
+{
+	ds_client_t *client = (ds_client_t *) arg;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "disp_get_info()");
+
+	ds_display_get_info(client->display, info);
+	return EOK;
+}
+
 /** @}
  */
