diff --git a/src/browser.c b/src/browser.c
index 8597b489b223ad686aeb38597dceab9e971db061..b74d590722e07c0b041d0b83daf480db81b17c70 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -51,32 +51,6 @@ unsigned char flags = BF_SIZE | BF_DESC;
     || x->flags & FF_EXL))
 
 
-/*
-void drawInfo(struct dir *dr) {
-  char path[PATH_MAX];
-
-  nccreate(11, 60, "Item info");
-
-  attron(A_BOLD);
-  ncaddstr(2, 3, "Name:");
-  ncaddstr(3, 3, "Path:");
-  ncaddstr(4, 3, "Type:");
-  ncaddstr(6, 3, "   Disk usage:");
-  ncaddstr(7, 3, "Apparent size:");
-  attroff(A_BOLD);
-
-  ncaddstr(2,  9, cropdir(dr->name, 49));
-  ncaddstr(3,  9, cropdir(getpath(dr, path), 49));
-  ncaddstr(4,  9, dr->flags & FF_DIR ? "Directory"
-      : dr->flags & FF_FILE ? "File" : "Other (link, device, socket, ..)");
-  ncprint(6, 18, "%s (%s B)", cropsize(dr->size),  fullsize(dr->size));
-  ncprint(7, 18, "%s (%s B)", cropsize(dr->asize), fullsize(dr->asize));
-
-  ncaddstr(9, 32, "Press i to hide this window");
-}
-*/
-
-
 int browse_cmp(struct dir *x, struct dir *y) {
   struct dir *a, *b;
   int r = 0;
@@ -157,6 +131,30 @@ struct dir *browse_sort(struct dir *list) {
 }
 
 
+void browse_draw_info(struct dir *dr) {
+  char path[PATH_MAX];
+
+  nccreate(11, 60, "Item info");
+
+  attron(A_BOLD);
+  ncaddstr(2, 3, "Name:");
+  ncaddstr(3, 3, "Path:");
+  ncaddstr(4, 3, "Type:");
+  ncaddstr(6, 3, "   Disk usage:");
+  ncaddstr(7, 3, "Apparent size:");
+  attroff(A_BOLD);
+
+  ncaddstr(2,  9, cropstr(dr->name, 49));
+  ncaddstr(3,  9, cropstr(getpath(dr, path), 49));
+  ncaddstr(4,  9, dr->flags & FF_DIR ? "Directory"
+      : dr->flags & FF_FILE ? "File" : "Other (link, device, socket, ..)");
+  ncprint(6, 18, "%s (%s B)", formatsize(dr->size),  fullsize(dr->size));
+  ncprint(7, 18, "%s (%s B)", formatsize(dr->asize), fullsize(dr->asize));
+
+  ncaddstr(9, 32, "Press i to hide this window");
+}
+
+
 void browse_draw_item(struct dir *n, int row, off_t max, int ispar) {
   char tmp[1000], ct, dt, *size, gr[11];
   int i, o;
@@ -225,7 +223,7 @@ void browse_draw_item(struct dir *n, int row, off_t max, int ispar) {
 
 
 int browse_draw() {
-  struct dir *n, ref, *cur;
+  struct dir *n, ref, *cur, *sel = NULL;
   char tmp[PATH_MAX];
   int selected, i;
   off_t max = 1;
@@ -271,8 +269,10 @@ int browse_draw() {
   for(n=cur, selected=i=0; n!=NULL; n=n->next) {
     if(ishidden(n))
       continue;
-    if(n->flags & FF_BSEL)
+    if(n->flags & FF_BSEL) {
       selected = i;
+      sel = n;
+    }
     if((flags & BF_AS ? n->asize : n->size) > max)
       max = flags & BF_AS ? n->asize : n->size;
     i++;
@@ -296,6 +296,10 @@ int browse_draw() {
     browse_draw_item(n, 2+i++, max, n == &ref);
   }
 
+  /* draw information window */
+  if(sel && (flags & BF_INFO) && sel != &ref)
+    browse_draw_info(sel);
+
   /* move cursor to selected row for accessibility */
   move(selected+2, 0);
   return 0;
@@ -332,11 +336,10 @@ void browse_key_sel(int change) {
 
 
 #define toggle(x,y) if(x & y) x -=y; else x |= y
-#define hideinfo if(flags & BF_INFO) flags -= BF_INFO
 
 int browse_key(int ch) {
   char tmp[PATH_MAX];
-  char sort = 0;
+  char sort = 0, nonfo = 0;
   struct dir *n;
 
   switch(ch) {
@@ -363,40 +366,39 @@ int browse_key(int ch) {
 
    /* sorting items */
     case 'n':
-      hideinfo;
       if(flags & BF_NAME)
         toggle(flags, BF_DESC);
       else
         flags = (flags & BF_HIDE) + (flags & BF_NDIRF) + BF_NAME;
       sort++;
+      nonfo++;
       break;
     case 's':
-      hideinfo;
       if(flags & BF_SIZE)
         toggle(flags, BF_DESC);
       else
         flags = (flags & BF_HIDE) + (flags & BF_NDIRF) + BF_SIZE + BF_DESC;
       sort++;
+      nonfo++;
       break;
     case 'h':
-      hideinfo;
       toggle(flags, BF_HIDE);
       browse_key_sel(0);
+      nonfo++;
       break;
     case 't':
-      hideinfo;
       toggle(flags, BF_NDIRF);
       sort++;
+      nonfo++;
       break;
     case 'a':
-      hideinfo;
       toggle(flags, BF_AS);
+      nonfo++;
       break;
 
    /* browsing */
     case 10:
     case KEY_RIGHT:
-      hideinfo;
       for(n=browse_dir; n!=NULL; n=n->next)
         if(n->flags & FF_BSEL)
           break;
@@ -404,19 +406,20 @@ int browse_key(int ch) {
         browse_dir = n->sub;
       if(n == NULL && browse_dir->parent->parent)
         browse_dir = browse_dir->parent->parent->sub;
+      nonfo++;
       sort++;
       break;
     case KEY_LEFT:
-      hideinfo;
       if(browse_dir->parent->parent != NULL)
         browse_dir = browse_dir->parent->parent->sub;
+      nonfo++;
       sort++;
       break;
 
    /* refresh */
     case 'r':
-      hideinfo;
       calc_init(getpath(browse_dir, tmp), browse_dir->parent);
+      nonfo++;
       sort++;
       break;
 
@@ -424,31 +427,34 @@ int browse_key(int ch) {
     case 'q':
       return 1;
     case 'g':
-      hideinfo;
-      if(++graph > 3) graph = 0;
+      if(++graph > 3)
+        graph = 0;
+      nonfo++;
+      break;
+    case 'i':
+      toggle(flags, BF_INFO);
       break;
       /*
     case '?':
-      hideinfo;
       showHelp();
-      break;
-    case 'i':
-      toggle(flags, BF_INFO);
+      nonfo++;
       break;
     case 'd':
-      hideinfo;
       drawBrowser(0);
       n = selected();
       if(n != bcur->parent)
         bcur = showDelete(n);
       if(bcur && bcur->parent)
         bcur = bcur->parent->sub;
+      nonfo++;
       break;
         */
   }
 
   if(sort)
     browse_dir = browse_sort(browse_dir);
+  if(nonfo)
+    flags &= ~BF_INFO;
   return 0;
 }