Index: uspace/lib/ui/private/filedialog.h
===================================================================
--- uspace/lib/ui/private/filedialog.h	(revision 3c22438add89eecf2847ebd7fb66d92bbdec0ea4)
+++ uspace/lib/ui/private/filedialog.h	(revision b979ffbe85306f4a2b9b3c98f2311014a3ae021e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -38,4 +38,6 @@
 #define _UI_PRIVATE_FILEDIALOG_H
 
+#include <gfx/coord.h>
+
 /** Actual structure of file dialog.
  *
@@ -59,4 +61,23 @@
 };
 
+/** File dialog geometry.
+ *
+ * Computed geometry of file dialog.
+ */
+typedef struct {
+	/** File name label rectangle */
+	gfx_rect_t fname_label_rect;
+	/** File name entry rectangle */
+	gfx_rect_t entry_rect;
+	/** Files label rectangle */
+	gfx_rect_t files_label_rect;
+	/** File list rectangle */
+	gfx_rect_t flist_rect;
+	/** File list rectangle */
+	gfx_rect_t bok_rect;
+	/** File list rectangle */
+	gfx_rect_t bcancel_rect;
+} ui_file_dialog_geom_t;
+
 #endif
 
Index: uspace/lib/ui/src/filedialog.c
===================================================================
--- uspace/lib/ui/src/filedialog.c	(revision 3c22438add89eecf2847ebd7fb66d92bbdec0ea4)
+++ uspace/lib/ui/src/filedialog.c	(revision b979ffbe85306f4a2b9b3c98f2311014a3ae021e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2024 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -48,8 +48,10 @@
 #include "../private/filedialog.h"
 
+static void ui_file_dialog_wnd_resize(ui_window_t *, void *);
 static void ui_file_dialog_wnd_close(ui_window_t *, void *);
 static void ui_file_dialog_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
 
 ui_window_cb_t ui_file_dialog_wnd_cb = {
+	.resize = ui_file_dialog_wnd_resize,
 	.close = ui_file_dialog_wnd_close,
 	.kbd = ui_file_dialog_wnd_kbd
@@ -87,4 +89,96 @@
 	memset(params, 0, sizeof(ui_file_dialog_params_t));
 	params->ifname = "";
+}
+
+/** Compute file dialog geometry.
+ *
+ * @param ui User interface
+ * @param wrect Window interior rectangle
+ * @param geom Place to store geometry
+ */
+static void ui_file_dialog_get_geom(ui_t *ui, gfx_rect_t *wrect,
+    ui_file_dialog_geom_t *geom)
+{
+	gfx_coord_t cx;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		geom->fname_label_rect.p0.x = 3;
+		geom->fname_label_rect.p0.y = 2;
+		geom->fname_label_rect.p1.x = 17;
+		geom->fname_label_rect.p1.y = 3;
+	} else {
+		geom->fname_label_rect.p0.x = 10;
+		geom->fname_label_rect.p0.y = 35;
+		geom->fname_label_rect.p1.x = 190;
+		geom->fname_label_rect.p1.y = 50;
+	}
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		geom->entry_rect.p0.x = 3;
+		geom->entry_rect.p0.y = 3;
+		geom->entry_rect.p1.x = wrect->p1.x - 3;
+		geom->entry_rect.p1.y = 4;
+	} else {
+		geom->entry_rect.p0.x = 10;
+		geom->entry_rect.p0.y = 55;
+		geom->entry_rect.p1.x = wrect->p1.x - 10;
+		geom->entry_rect.p1.y = 80;
+	}
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		geom->files_label_rect.p0.x = 3;
+		geom->files_label_rect.p0.y = 5;
+		geom->files_label_rect.p1.x = 17;
+		geom->files_label_rect.p1.y = 6;
+	} else {
+		geom->files_label_rect.p0.x = 10;
+		geom->files_label_rect.p0.y = 90;
+		geom->files_label_rect.p1.x = 190;
+		geom->files_label_rect.p1.y = 105;
+	}
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		geom->flist_rect.p0.x = 3;
+		geom->flist_rect.p0.y = 6;
+		geom->flist_rect.p1.x = wrect->p1.x - 3;
+		geom->flist_rect.p1.y = wrect->p1.y - 4;
+	} else {
+		geom->flist_rect.p0.x = 10;
+		geom->flist_rect.p0.y = 110;
+		geom->flist_rect.p1.x = wrect->p1.x - 10;
+		geom->flist_rect.p1.y = wrect->p1.y - 55;
+	}
+
+	cx = (wrect->p0.x + wrect->p1.x) / 2;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		geom->bok_rect.p0.x = cx - 10;
+		geom->bok_rect.p0.y = wrect->p1.y - 3;
+		geom->bok_rect.p1.x = cx;
+		geom->bok_rect.p1.y = wrect->p1.y - 2;
+	} else {
+		geom->bok_rect.p0.x = cx - 95;
+		geom->bok_rect.p0.y = wrect->p1.y - 45;
+		geom->bok_rect.p1.x = cx - 5;
+		geom->bok_rect.p1.y = wrect->p1.y - 17;
+	}
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		geom->bcancel_rect.p0.x = cx + 2;
+		geom->bcancel_rect.p0.y = wrect->p1.y - 3;
+		geom->bcancel_rect.p1.x = cx + 12;
+		geom->bcancel_rect.p1.y = wrect->p1.y - 2;
+	} else {
+		geom->bcancel_rect.p0.x = cx + 5;
+		geom->bcancel_rect.p0.y = wrect->p1.y - 45;
+		geom->bcancel_rect.p1.x = cx + 95;
+		geom->bcancel_rect.p1.y = wrect->p1.y - 17;
+	}
 }
 
@@ -109,5 +203,6 @@
 	ui_pbutton_t *bok = NULL;
 	ui_pbutton_t *bcancel = NULL;
-	gfx_rect_t rect;
+	ui_file_dialog_geom_t geom;
+	gfx_rect_t arect;
 	ui_resource_t *ui_res;
 
@@ -120,4 +215,5 @@
 	ui_wnd_params_init(&wparams);
 	wparams.caption = params->caption;
+	wparams.style |= ui_wds_maximize_btn | ui_wds_resizable;
 
 	/* FIXME: Auto layout */
@@ -127,4 +223,7 @@
 		wparams.rect.p1.x = 40;
 		wparams.rect.p1.y = 20;
+
+		wparams.min_size.x = 30;
+		wparams.min_size.y = 10;
 	} else {
 		wparams.rect.p0.x = 0;
@@ -132,4 +231,7 @@
 		wparams.rect.p1.x = 300;
 		wparams.rect.p1.y = 335;
+
+		wparams.min_size.x = 240;
+		wparams.min_size.y = 260;
 	}
 
@@ -140,6 +242,10 @@
 	ui_window_set_cb(window, &ui_file_dialog_wnd_cb, dialog);
 
+	ui_window_get_app_rect(window, &arect);
 	ui_res = ui_window_get_res(window);
 
+	/* Compute geometry. */
+	ui_file_dialog_get_geom(ui, &arect, &geom);
+
 	rc = ui_fixed_create(&fixed);
 	if (rc != EOK)
@@ -150,18 +256,5 @@
 		goto error;
 
-	/* FIXME: Auto layout */
-	if (ui_is_textmode(ui)) {
-		rect.p0.x = 3;
-		rect.p0.y = 2;
-		rect.p1.x = 17;
-		rect.p1.y = 3;
-	} else {
-		rect.p0.x = 10;
-		rect.p0.y = 35;
-		rect.p1.x = 190;
-		rect.p1.y = 50;
-	}
-
-	ui_label_set_rect(label, &rect);
+	ui_label_set_rect(label, &geom.fname_label_rect);
 
 	rc = ui_fixed_add(fixed, ui_label_ctl(label));
@@ -175,18 +268,5 @@
 		goto error;
 
-	/* FIXME: Auto layout */
-	if (ui_is_textmode(ui)) {
-		rect.p0.x = 3;
-		rect.p0.y = 3;
-		rect.p1.x = 37;
-		rect.p1.y = 4;
-	} else {
-		rect.p0.x = 10;
-		rect.p0.y = 55;
-		rect.p1.x = 290;
-		rect.p1.y = 80;
-	}
-
-	ui_entry_set_rect(entry, &rect);
+	ui_entry_set_rect(entry, &geom.entry_rect);
 
 	rc = ui_fixed_add(fixed, ui_entry_ctl(entry));
@@ -208,18 +288,5 @@
 		goto error;
 
-	/* FIXME: Auto layout */
-	if (ui_is_textmode(ui)) {
-		rect.p0.x = 3;
-		rect.p0.y = 5;
-		rect.p1.x = 17;
-		rect.p1.y = 6;
-	} else {
-		rect.p0.x = 10;
-		rect.p0.y = 90;
-		rect.p1.x = 190;
-		rect.p1.y = 105;
-	}
-
-	ui_label_set_rect(label, &rect);
+	ui_label_set_rect(label, &geom.files_label_rect);
 
 	rc = ui_fixed_add(fixed, ui_label_ctl(label));
@@ -235,18 +302,5 @@
 		goto error;
 
-	/* FIXME: Auto layout */
-	if (ui_is_textmode(ui)) {
-		rect.p0.x = 3;
-		rect.p0.y = 6;
-		rect.p1.x = 37;
-		rect.p1.y = 16;
-	} else {
-		rect.p0.x = 10;
-		rect.p0.y = 110;
-		rect.p1.x = 290;
-		rect.p1.y = 280;
-	}
-
-	ui_file_list_set_rect(flist, &rect);
+	ui_file_list_set_rect(flist, &geom.flist_rect);
 	ui_file_list_set_cb(flist, &ui_file_dialog_flist_cb, dialog);
 
@@ -269,20 +323,5 @@
 
 	ui_pbutton_set_cb(bok, &ui_file_dialog_bok_cb, dialog);
-
-	/* FIXME: Auto layout */
-	if (ui_is_textmode(ui)) {
-		rect.p0.x = 10;
-		rect.p0.y = 17;
-		rect.p1.x = 20;
-		rect.p1.y = 18;
-	} else {
-		rect.p0.x = 55;
-		rect.p0.y = 290;
-		rect.p1.x = 145;
-		rect.p1.y = 318;
-	}
-
-	ui_pbutton_set_rect(bok, &rect);
-
+	ui_pbutton_set_rect(bok, &geom.bok_rect);
 	ui_pbutton_set_default(bok, true);
 
@@ -301,19 +340,5 @@
 
 	ui_pbutton_set_cb(bcancel, &ui_file_dialog_bcancel_cb, dialog);
-
-	/* FIXME: Auto layout */
-	if (ui_is_textmode(ui)) {
-		rect.p0.x = 22;
-		rect.p0.y = 17;
-		rect.p1.x = 32;
-		rect.p1.y = 18;
-	} else {
-		rect.p0.x = 155;
-		rect.p0.y = 290;
-		rect.p1.x = 245;
-		rect.p1.y = 318;
-	}
-
-	ui_pbutton_set_rect(bcancel, &rect);
+	ui_pbutton_set_rect(bcancel, &geom.bcancel_rect);
 
 	rc = ui_fixed_add(fixed, ui_pbutton_ctl(bcancel));
@@ -380,4 +405,29 @@
 }
 
+/** File dialog window resize handler.
+ *
+ * @param window Window
+ * @param arg Argument (ui_file_dialog_t *)
+ */
+static void ui_file_dialog_wnd_resize(ui_window_t *window, void *arg)
+{
+	ui_file_dialog_t *dialog = (ui_file_dialog_t *) arg;
+	gfx_rect_t arect;
+	ui_file_dialog_geom_t geom;
+
+	/* Get new window application rectangle. */
+	ui_window_get_app_rect(window, &arect);
+
+	/* Compute geometry. */
+	ui_file_dialog_get_geom(ui_window_get_ui(window), &arect, &geom);
+
+	ui_entry_set_rect(dialog->ename, &geom.entry_rect);
+	ui_file_list_set_rect(dialog->flist, &geom.flist_rect);
+	ui_pbutton_set_rect(dialog->bok, &geom.bok_rect);
+	ui_pbutton_set_rect(dialog->bcancel, &geom.bcancel_rect);
+
+	(void)ui_window_paint(window);
+}
+
 /** File dialog window close handler.
  *
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision 3c22438add89eecf2847ebd7fb66d92bbdec0ea4)
+++ uspace/lib/ui/src/window.c	(revision b979ffbe85306f4a2b9b3c98f2311014a3ae021e)
@@ -840,8 +840,4 @@
 	}
 
-	/* Need to repaint UI if windows are emulated */
-	if (ui_is_fullscreen(window->ui))
-		(void)ui_paint(window->ui);
-
 	switch (scop) {
 	case ui_wsc_resize:
@@ -876,5 +872,15 @@
 errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect)
 {
-	return ui_window_size_change(window, rect, ui_wsc_resize);
+	errno_t rc;
+
+	rc = ui_window_size_change(window, rect, ui_wsc_resize);
+	if (rc != EOK)
+		return rc;
+
+	/* Need to repaint UI if windows are emulated */
+	if (ui_is_fullscreen(window->ui))
+		(void)ui_paint(window->ui);
+
+	return EOK;
 }
 
@@ -1578,5 +1584,10 @@
 
 	window->normal_rect = old_rect;
-	(void) ui_window_paint(window);
+	ui_window_send_resize(window);
+
+	/* Need to repaint UI if windows are emulated */
+	if (ui_is_fullscreen(window->ui))
+		(void)ui_paint(window->ui);
+
 	return EOK;
 }
@@ -1603,5 +1614,10 @@
 	}
 
-	(void) ui_window_paint(window);
+	ui_window_send_resize(window);
+
+	/* Need to repaint UI if windows are emulated */
+	if (ui_is_fullscreen(window->ui))
+		(void)ui_paint(window->ui);
+
 	return EOK;
 }
