Index: rtorrent/src/control.cc
===================================================================
--- rtorrent/src/control.cc	(revision 622)
+++ rtorrent/src/control.cc	(working copy)
@@ -92,8 +92,8 @@
   display::Window::slot_unschedule(rak::make_mem_fun(m_display, &display::Manager::unschedule));
   display::Window::slot_adjust(rak::make_mem_fun(m_display, &display::Manager::adjust_layout));
 
-  m_core->get_poll_manager()->signal_interrupted().connect(sigc::mem_fun(*m_inputStdin, &input::InputEvent::event_read));
-  m_core->get_poll_manager()->signal_interrupted().connect(sigc::ptr_fun(display::Canvas::do_update));
+//   m_core->get_poll_manager()->signal_interrupted().connect(sigc::mem_fun(*m_inputStdin, &input::InputEvent::event_read));
+//   m_core->get_poll_manager()->signal_interrupted().connect(sigc::ptr_fun(display::Canvas::do_update));
   m_core->get_poll_manager()->get_http_stack()->set_user_agent(std::string(PACKAGE "/" VERSION "/") + torrent::version());
 
   m_core->initialize_second();
Index: rtorrent/src/display/canvas.cc
===================================================================
--- rtorrent/src/display/canvas.cc	(revision 621)
+++ rtorrent/src/display/canvas.cc	(working copy)
@@ -36,6 +36,9 @@
 
 #include "config.h"
 
+#include <unistd.h>
+#include <sys/ioctl.h>
+
 #include "canvas.h"
 
 namespace display {
@@ -74,4 +77,14 @@
   endwin();
 }
 
+std::pair<int, int>
+Canvas::term_size() {
+  struct winsize ws;
+
+  if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == 0)
+    return std::pair<int, int>(ws.ws_col, ws.ws_row);
+  else
+    return std::pair<int, int>(80, 24);
 }
+
+}
Index: rtorrent/src/display/manager.h
===================================================================
--- rtorrent/src/display/manager.h	(revision 621)
+++ rtorrent/src/display/manager.h	(working copy)
@@ -64,6 +64,8 @@
   Manager();
   ~Manager();
 
+  void                force_redraw();
+
   iterator            insert(iterator pos, Window* w);
   iterator            erase(iterator pos);
   iterator            erase(Window* w);
@@ -80,6 +82,7 @@
 
   void                schedule_update();
 
+  bool                m_forceRedraw;
   rak::timer          m_timeLastUpdate;
 
   rak::priority_queue_default m_scheduler;
Index: rtorrent/src/display/canvas.h
===================================================================
--- rtorrent/src/display/canvas.h	(revision 621)
+++ rtorrent/src/display/canvas.h	(working copy)
@@ -51,10 +51,14 @@
   void                refresh()                                               { wnoutrefresh(m_window); }
   static void         refresh_std()                                           { wnoutrefresh(stdscr); }
   void                redraw()                                                { redrawwin(m_window); }
+  static void         redraw_std()                                            { redrawwin(stdscr); }
 
   void                resize(int w, int h)                                    { wresize(m_window, h, w); }
   void                resize(int x, int y, int w, int h);
 
+  static void         resize_term(int x, int y)                               { resizeterm(y, x); }
+  static void         resize_term(std::pair<int, int> dim)                    { resizeterm(dim.second, dim.first); }
+
   int                 get_x()                                                 { int x, y; getyx(m_window, y, x); return x; }
   int                 get_y()                                                 { int x, y; getyx(m_window, y, x); return y; }
   int                 get_width()                                             { int x, y; getmaxyx(m_window, y, x); return x; }
@@ -116,6 +120,8 @@
   static int          get_screen_width()                                      { int x, y; getmaxyx(stdscr, y, x); return x; }
   static int          get_screen_height()                                     { int x, y; getmaxyx(stdscr, y, x); return y; }
 
+  static std::pair<int, int> term_size();
+
   static void         do_update()                                             { doupdate(); }
 
 private:
Index: rtorrent/src/display/manager.cc
===================================================================
--- rtorrent/src/display/manager.cc	(revision 621)
+++ rtorrent/src/display/manager.cc	(working copy)
@@ -47,7 +47,8 @@
 
 namespace display {
 
-Manager::Manager() {
+Manager::Manager() :
+  m_forceRedraw(false) {
   m_taskUpdate.set_slot(rak::mem_fn(this, &Manager::receive_update));
 }
 
@@ -55,6 +56,12 @@
   priority_queue_erase(&taskScheduler, &m_taskUpdate);
 }
 
+void
+Manager::force_redraw() {
+  m_forceRedraw = true;
+}
+
+
 Manager::iterator
 Manager::insert(iterator pos, Window* w) {
   return Base::insert(pos, w);
@@ -125,12 +132,21 @@
     h += (*itr)->get_min_height();
 
     (*itr)->resize(0, height, Canvas::get_screen_width(), h);
+    (*itr)->redraw();
     (*itr)->mark_dirty();
   }
 }
 
 void
 Manager::receive_update() {
+  if (m_forceRedraw) {
+    m_forceRedraw = false;
+
+    display::Canvas::resize_term(display::Canvas::term_size());
+    Canvas::redraw_std();
+    adjust_layout();
+  }
+
   Canvas::refresh_std();
 
   rak::priority_queue_perform(&m_scheduler, cachedTime);
Index: rtorrent/src/main.cc
===================================================================
--- rtorrent/src/main.cc	(revision 623)
+++ rtorrent/src/main.cc	(working copy)
@@ -167,10 +167,11 @@
     initialize_option_handler(control);
 
     SignalHandler::set_ignore(SIGPIPE);
-    SignalHandler::set_handler(SIGINT,  sigc::mem_fun(control, &Control::receive_shutdown));
-    SignalHandler::set_handler(SIGSEGV, sigc::bind(sigc::ptr_fun(&do_panic), SIGSEGV));
-    SignalHandler::set_handler(SIGBUS,  sigc::bind(sigc::ptr_fun(&do_panic), SIGBUS));
-    SignalHandler::set_handler(SIGFPE,  sigc::bind(sigc::ptr_fun(&do_panic), SIGFPE));
+    SignalHandler::set_handler(SIGINT,   sigc::mem_fun(control, &Control::receive_shutdown));
+    SignalHandler::set_handler(SIGWINCH, sigc::mem_fun(control->display(), &display::Manager::force_redraw));
+    SignalHandler::set_handler(SIGSEGV,  sigc::bind(sigc::ptr_fun(&do_panic), SIGSEGV));
+    SignalHandler::set_handler(SIGBUS,   sigc::bind(sigc::ptr_fun(&do_panic), SIGBUS));
+    SignalHandler::set_handler(SIGFPE,   sigc::bind(sigc::ptr_fun(&do_panic), SIGFPE));
 
     control->core()->initialize_first();
 
Index: rtorrent/src/ui/root.cc
===================================================================
--- rtorrent/src/ui/root.cc	(revision 621)
+++ rtorrent/src/ui/root.cc	(working copy)
@@ -108,8 +108,9 @@
   m_bindings['D']           = sigc::bind(sigc::mem_fun(*this, &Root::adjust_down_throttle), 50);
   m_bindings['C']           = sigc::bind(sigc::mem_fun(*this, &Root::adjust_down_throttle), -50);
 
-  m_bindings[KEY_RESIZE]    = sigc::mem_fun(*m_control->display(), &display::Manager::adjust_layout);
-  m_bindings['\x11']        = sigc::mem_fun(*m_control, &Control::receive_shutdown);
+  //m_bindings[KEY_RESIZE]    = sigc::mem_fun(*m_control->display(), &display::Manager::adjust_layout);
+  m_bindings['\x0C']        = sigc::mem_fun(m_control->display(), &display::Manager::force_redraw);
+  m_bindings['\x11']        = sigc::mem_fun(m_control, &Control::receive_shutdown);
 }
 
 void

