diff --git a/commands.c b/commands.c
index f358ed3..3e108a4 100644
--- a/commands.c
+++ b/commands.c
@@ -33,6 +33,7 @@
 void cleanup(void);
 void remove_file(int, bool);
 void load_image(int);
+void open_info(void);
 void redraw(void);
 void reset_cursor(void);
 void animate(void);
@@ -92,10 +93,13 @@ bool it_toggle_fullscreen(arg_t a)
 bool it_toggle_bar(arg_t a)
 {
 	win_toggle_bar(&win);
-	if (mode == MODE_IMAGE)
+	if (mode == MODE_IMAGE) {
 		img.checkpan = img.dirty = true;
-	else
+		if (win.bar.h > 0)
+			open_info();
+	} else {
 		tns.dirty = true;
+	}
 	return true;
 }
 
diff --git a/main.c b/main.c
index f648dab..d6cdcd4 100644
--- a/main.c
+++ b/main.c
@@ -76,6 +76,7 @@ struct {
   char *script;
   int fd;
   unsigned int i, lastsep;
+  bool open;
 } info;
 
 timeout_t timeouts[] = {
@@ -218,23 +219,25 @@ void open_info(void)
 	static pid_t pid;
 	int pfd[2];
 
-	win.bar.l[0] = '\0';
-
+	if (info.script == NULL || info.open || win.bar.h == 0)
+		return;
 	if (info.fd != -1) {
 		close(info.fd);
 		kill(pid, SIGTERM);
 		while (waitpid(-1, NULL, WNOHANG) > 0);
 		info.fd = -1;
 	}
-	if (info.script == NULL || pipe(pfd) < 0)
-		return;
+	win.bar.l[0] = '\0';
 
+	if (pipe(pfd) < 0)
+		return;
 	pid = fork();
 	if (pid > 0) {
 		close(pfd[1]);
 		fcntl(pfd[0], F_SETFL, O_NONBLOCK);
 		info.fd = pfd[0];
 		info.i = info.lastsep = 0;
+		info.open = true;
 	} else if (pid == 0) {
 		close(pfd[0]);
 		dup2(pfd[1], 1);
@@ -293,6 +296,7 @@ void load_image(int new)
 	alternate = fileidx;
 	fileidx = new;
 
+	info.open = false;
 	open_info();
 
 	if (img.multi.cnt > 0 && img.multi.animate)
@@ -312,9 +316,18 @@ void update_info(void)
 	for (fw = 0, i = filecnt; i > 0; fw++, i /= 10);
 	sel = mode == MODE_IMAGE ? fileidx : tns.sel;
 
+	/* update window title */
 	if (mode == MODE_THUMB) {
 		win_set_title(&win, "sxiv");
+	} else {
+		snprintf(title, sizeof(title), "sxiv - %s", files[sel].name);
+		win_set_title(&win, title);
+	}
 
+	/* update bar contents */
+	if (win.bar.h == 0)
+		return;
+	if (mode == MODE_THUMB) {
 		if (tns.cnt == filecnt) {
 			n = snprintf(rt, rlen, "%0*d/%d", fw, sel + 1, filecnt);
 			ow_info = true;
@@ -324,9 +337,6 @@ void update_info(void)
 			ow_info = false;
 		}
 	} else {
-		snprintf(title, sizeof(title), "sxiv - %s", files[sel].name);
-		win_set_title(&win, title);
-
 		n = snprintf(rt, rlen, "%3d%% ", (int) (img.zoom * 100.0));
 		if (img.multi.cnt > 0) {
 			for (fn = 0, i = img.multi.cnt; i > 0; fn++, i /= 10);
diff --git a/window.c b/window.c
index a51499e..30081de 100644
--- a/window.c
+++ b/window.c
@@ -119,12 +119,15 @@ void win_init(win_t *win)
 	e->cmap = DefaultColormap(e->dpy, e->scr);
 	e->depth = DefaultDepth(e->dpy, e->scr);
 
+	win_init_font(e->dpy, BAR_FONT);
+
 	win->white     = WhitePixel(e->dpy, e->scr);
 	win->bgcol     = win_alloc_color(win, WIN_BG_COLOR);
 	win->fscol     = win_alloc_color(win, WIN_FS_COLOR);
 	win->selcol    = win_alloc_color(win, SEL_COLOR);
 	win->bar.bgcol = win_alloc_color(win, BAR_BG_COLOR);
 	win->bar.fgcol = win_alloc_color(win, BAR_FG_COLOR);
+	win->bar.h     = options->hide_bar ? 0 : barheight;
 
 	win->sizehints.flags = PWinGravity;
 	win->sizehints.win_gravity = NorthWestGravity;
@@ -135,8 +138,6 @@ void win_init(win_t *win)
 	if (setlocale(LC_CTYPE, "") == NULL || XSupportsLocale() == 0)
 		warn("no locale support");
 
-	win_init_font(e->dpy, BAR_FONT);
-
 	wm_delete_win = XInternAtom(e->dpy, "WM_DELETE_WINDOW", False);
 }