Index: uspace/app/viewer/viewer.c
===================================================================
--- uspace/app/viewer/viewer.c	(revision 3f81cdcfbfdc8a272c50a8df92c53bd212f39b7e)
+++ uspace/app/viewer/viewer.c	(revision c3d4b39b243e104029fd4c4b7a079d896faf3369)
@@ -55,4 +55,5 @@
 	char **imgs;
 
+	bool fullscreen;
 	ui_window_t *window;
 	gfx_bitmap_t *bitmap;
@@ -66,4 +67,5 @@
     gfx_rect_t *);
 static bool viewer_img_setup(viewer_t *, gfx_bitmap_t *, gfx_rect_t *);
+static void viewer_window_destroy(viewer_t *);
 
 static void wnd_close(ui_window_t *, void *);
@@ -219,78 +221,13 @@
 }
 
-int main(int argc, char *argv[])
-{
-	const char *display_spec = UI_ANY_DEFAULT;
+static errno_t viewer_window_create(viewer_t *viewer)
+{
+	ui_wnd_params_t params;
 	gfx_bitmap_t *lbitmap;
 	gfx_rect_t lrect;
-	bool fullscreen = false;
-	gfx_rect_t rect;
 	gfx_rect_t wrect;
 	gfx_coord2_t off;
-	ui_t *ui = NULL;
-	ui_wnd_params_t params;
-	viewer_t *viewer;
+	gfx_rect_t rect;
 	errno_t rc;
-	int i;
-	unsigned u;
-
-	viewer = calloc(1, sizeof(viewer_t));
-	if (viewer == NULL) {
-		printf("Out of memory.\n");
-		goto error;
-	}
-
-	i = 1;
-	while (i < argc && argv[i][0] == '-') {
-		if (str_cmp(argv[i], "-d") == 0) {
-			++i;
-			if (i >= argc) {
-				printf("Argument missing.\n");
-				print_syntax();
-				goto error;
-			}
-
-			display_spec = argv[i++];
-		} else if (str_cmp(argv[i], "-f") == 0) {
-			++i;
-			fullscreen = true;
-		} else {
-			printf("Invalid option '%s'.\n", argv[i]);
-			print_syntax();
-			goto error;
-		}
-	}
-
-	if (i >= argc) {
-		printf("No image files specified.\n");
-		print_syntax();
-		goto error;
-	}
-
-	viewer->imgs_count = argc - i;
-	viewer->imgs = calloc(viewer->imgs_count, sizeof(char *));
-	if (viewer->imgs == NULL) {
-		printf("Out of memory.\n");
-		goto error;
-	}
-
-	for (int j = 0; j < argc - i; j++) {
-		viewer->imgs[j] = str_dup(argv[i + j]);
-		if (viewer->imgs[j] == NULL) {
-			printf("Out of memory.\n");
-			goto error;
-		}
-	}
-
-	rc = ui_create(display_spec, &ui);
-	if (rc != EOK) {
-		printf("Error creating UI on display %s.\n", display_spec);
-		goto error;
-	}
-
-	if (ui_is_fullscreen(ui))
-		fullscreen = true;
-
-	viewer->ui = ui;
 
 	/*
@@ -305,10 +242,10 @@
 	params.rect.p1.y = 1;
 
-	if (fullscreen) {
+	if (viewer->fullscreen) {
 		params.style &= ~ui_wds_decorated;
 		params.placement = ui_wnd_place_full_screen;
 	}
 
-	rc = ui_window_create(ui, &params, &viewer->window);
+	rc = ui_window_create(viewer->ui, &params, &viewer->window);
 	if (rc != EOK) {
 		printf("Error creating window.\n");
@@ -331,9 +268,9 @@
 	 * to rect
 	 */
-	ui_wdecor_rect_from_app(ui, params.style, &lrect, &wrect);
+	ui_wdecor_rect_from_app(viewer->ui, params.style, &lrect, &wrect);
 	off = wrect.p0;
 	gfx_rect_rtranslate(&off, &wrect, &rect);
 
-	if (!fullscreen) {
+	if (!viewer->fullscreen) {
 		rc = ui_window_resize(viewer->window, &rect);
 		if (rc != EOK) {
@@ -354,4 +291,89 @@
 		goto error;
 	}
+
+	return EOK;
+error:
+	viewer_window_destroy(viewer);
+	return rc;
+}
+
+static void viewer_window_destroy(viewer_t *viewer)
+{
+	if (viewer->window != NULL)
+		ui_window_destroy(viewer->window);
+	viewer->window = NULL;
+}
+
+int main(int argc, char *argv[])
+{
+	const char *display_spec = UI_ANY_DEFAULT;
+	ui_t *ui = NULL;
+	viewer_t *viewer;
+	errno_t rc;
+	int i;
+	unsigned u;
+
+	viewer = calloc(1, sizeof(viewer_t));
+	if (viewer == NULL) {
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	i = 1;
+	while (i < argc && argv[i][0] == '-') {
+		if (str_cmp(argv[i], "-d") == 0) {
+			++i;
+			if (i >= argc) {
+				printf("Argument missing.\n");
+				print_syntax();
+				goto error;
+			}
+
+			display_spec = argv[i++];
+		} else if (str_cmp(argv[i], "-f") == 0) {
+			++i;
+			viewer->fullscreen = true;
+		} else {
+			printf("Invalid option '%s'.\n", argv[i]);
+			print_syntax();
+			goto error;
+		}
+	}
+
+	if (i >= argc) {
+		printf("No image files specified.\n");
+		print_syntax();
+		goto error;
+	}
+
+	viewer->imgs_count = argc - i;
+	viewer->imgs = calloc(viewer->imgs_count, sizeof(char *));
+	if (viewer->imgs == NULL) {
+		printf("Out of memory.\n");
+		goto error;
+	}
+
+	for (int j = 0; j < argc - i; j++) {
+		viewer->imgs[j] = str_dup(argv[i + j]);
+		if (viewer->imgs[j] == NULL) {
+			printf("Out of memory.\n");
+			goto error;
+		}
+	}
+
+	rc = ui_create(display_spec, &ui);
+	if (rc != EOK) {
+		printf("Error creating UI on display %s.\n", display_spec);
+		goto error;
+	}
+
+	if (ui_is_fullscreen(ui))
+		viewer->fullscreen = true;
+
+	viewer->ui = ui;
+
+	rc = viewer_window_create(viewer);
+	if (rc != EOK)
+		goto error;
 
 	ui_run(ui);
@@ -370,6 +392,6 @@
 		free(viewer->imgs);
 	}
-	if (viewer != NULL && viewer->window != NULL)
-		ui_window_destroy(viewer->window);
+	if (viewer != NULL)
+		viewer_window_destroy(viewer);
 	if (ui != NULL)
 		ui_destroy(ui);
