Index: uspace/lib/ui/private/wdecor.h
===================================================================
--- uspace/lib/ui/private/wdecor.h	(revision 20d2c6c347e0268ccd70ae81f107a1b4dd219ebb)
+++ uspace/lib/ui/private/wdecor.h	(revision 172188a438435269d832f06a54186d03a955efe5)
@@ -63,6 +63,22 @@
 };
 
+/** Window decoration geometry.
+ *
+ * Computed rectangles of window decoration elements.
+ */
+typedef struct {
+	/** Interior rectangle */
+	gfx_rect_t interior_rect;
+	/** Title bar rectangle */
+	gfx_rect_t title_bar_rect;
+	/** Close button rectangle */
+	gfx_rect_t btn_close_rect;
+	/** Application area rectangle */
+	gfx_rect_t app_area_rect;
+} ui_wdecor_geom_t;
+
 extern void ui_wdecor_close(ui_wdecor_t *);
 extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *);
+extern void ui_wdecor_get_geom(ui_wdecor_t *, ui_wdecor_geom_t *);
 
 #endif
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision 20d2c6c347e0268ccd70ae81f107a1b4dd219ebb)
+++ uspace/lib/ui/src/wdecor.c	(revision 172188a438435269d832f06a54186d03a955efe5)
@@ -126,13 +126,10 @@
 void ui_wdecor_set_rect(ui_wdecor_t *wdecor, gfx_rect_t *rect)
 {
-	gfx_rect_t crect;
+	ui_wdecor_geom_t geom;
 
 	wdecor->rect = *rect;
-	crect.p0.x = rect->p1.x - 5 - 20;
-	crect.p0.y = rect->p0.y + 5;
-	crect.p1.x = rect->p1.x - 5;
-	crect.p1.y = rect->p0.y + 5 + 20;
-
-	ui_pbutton_set_rect(wdecor->btn_close, &crect);
+
+	ui_wdecor_get_geom(wdecor, &geom);
+	ui_pbutton_set_rect(wdecor->btn_close, &geom.btn_close_rect);
 }
 
@@ -161,6 +158,8 @@
 	gfx_text_fmt_t fmt;
 	gfx_coord2_t pos;
+	ui_wdecor_geom_t geom;
 
 	rect = wdecor->rect;
+	ui_wdecor_get_geom(wdecor, &geom);
 
 	rc = ui_paint_bevel(wdecor->res->gc, &rect,
@@ -182,7 +181,5 @@
 		return rc;
 
-	trect.p0 = rect.p0;
-	trect.p1.x = rect.p1.x;
-	trect.p1.y = rect.p0.y + 22;
+	trect = geom.title_bar_rect;
 
 	rc = ui_paint_bevel(wdecor->res->gc, &trect,
@@ -248,4 +245,30 @@
 }
 
+/** Get window decoration geometry.
+ *
+ * @param wdecor Window decoration
+ * @param geom Structure to fill in with computed geometry
+ */
+void ui_wdecor_get_geom(ui_wdecor_t *wdecor, ui_wdecor_geom_t *geom)
+{
+	geom->interior_rect.p0.x = wdecor->rect.p0.x + 4;
+	geom->interior_rect.p0.y = wdecor->rect.p0.y + 4;
+	geom->interior_rect.p1.x = wdecor->rect.p1.x - 4;
+	geom->interior_rect.p1.y = wdecor->rect.p1.y - 4;
+
+	geom->title_bar_rect.p0 = geom->interior_rect.p0;
+	geom->title_bar_rect.p1.x = geom->interior_rect.p1.x;
+	geom->title_bar_rect.p1.y = geom->interior_rect.p0.y + 22;
+
+	geom->btn_close_rect.p0.x = geom->title_bar_rect.p1.x - 1 - 20;
+	geom->btn_close_rect.p0.y = geom->title_bar_rect.p0.y + 1;
+	geom->btn_close_rect.p1.x = geom->title_bar_rect.p1.x - 1;
+	geom->btn_close_rect.p1.y = geom->title_bar_rect.p0.y + 1 + 20;
+
+	geom->app_area_rect.p0.x = geom->interior_rect.p0.x;
+	geom->app_area_rect.p0.y = geom->title_bar_rect.p1.y;
+	geom->app_area_rect.p1 = geom->interior_rect.p1;
+}
+
 /** Handle window decoration position event.
  *
@@ -255,27 +278,19 @@
 void ui_wdecor_pos_event(ui_wdecor_t *wdecor, pos_event_t *event)
 {
-	gfx_rect_t trect;
-	gfx_rect_t cbrect;
 	gfx_coord2_t pos;
-
-	trect.p0.x = wdecor->rect.p0.x + 3;
-	trect.p0.y = wdecor->rect.p0.y + 3;
-	trect.p1.x = wdecor->rect.p1.x - 3;
-	trect.p1.y = trect.p0.y + 22;
-
-	cbrect.p0.x = wdecor->rect.p1.x - 5 - 20;
-	cbrect.p0.y = wdecor->rect.p0.y + 5;
-	cbrect.p1.x = wdecor->rect.p1.x - 5;
-	cbrect.p1.y = wdecor->rect.p0.y + 5 + 20;
+	ui_wdecor_geom_t geom;
 
 	pos.x = event->hpos;
 	pos.y = event->vpos;
 
-	if (gfx_pix_inside_rect(&pos, &cbrect)) {
+	ui_wdecor_get_geom(wdecor, &geom);
+
+	if (gfx_pix_inside_rect(&pos, &geom.btn_close_rect)) {
 		ui_pbutton_pos_event(wdecor->btn_close, event);
 		return;
 	}
 
-	if (event->type == POS_PRESS && gfx_pix_inside_rect(&pos, &trect))
+	if (event->type == POS_PRESS &&
+	    gfx_pix_inside_rect(&pos, &geom.title_bar_rect))
 		ui_wdecor_move(wdecor, &pos);
 }
Index: uspace/lib/ui/test/wdecor.c
===================================================================
--- uspace/lib/ui/test/wdecor.c	(revision 20d2c6c347e0268ccd70ae81f107a1b4dd219ebb)
+++ uspace/lib/ui/test/wdecor.c	(revision 172188a438435269d832f06a54186d03a955efe5)
@@ -310,4 +310,45 @@
 }
 
+PCUT_TEST(get_geom)
+{
+	ui_wdecor_t *wdecor;
+	gfx_rect_t rect;
+	ui_wdecor_geom_t geom;
+	errno_t rc;
+
+	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 100;
+	rect.p1.y = 200;
+
+	ui_wdecor_set_rect(wdecor, &rect);
+	ui_wdecor_get_geom(wdecor, &geom);
+
+	PCUT_ASSERT_INT_EQUALS(14, geom.interior_rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(24, geom.interior_rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(96, geom.interior_rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(196, geom.interior_rect.p1.y);
+
+	PCUT_ASSERT_INT_EQUALS(14, geom.title_bar_rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(24, geom.title_bar_rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(96, geom.title_bar_rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(46, geom.title_bar_rect.p1.y);
+
+	PCUT_ASSERT_INT_EQUALS(75, geom.btn_close_rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(25, geom.btn_close_rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(95, geom.btn_close_rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(45, geom.btn_close_rect.p1.y);
+
+	PCUT_ASSERT_INT_EQUALS(14, geom.app_area_rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(46, geom.app_area_rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(96, geom.app_area_rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(196, geom.app_area_rect.p1.y);
+
+	ui_wdecor_destroy(wdecor);
+}
+
 static errno_t testgc_set_color(void *arg, gfx_color_t *color)
 {
