Ticket #71: redraw.diff

File redraw.diff, 7.1 KB (added by rakshasa, 6 years ago)

Redraw on SIGWINCH and L.

  • rtorrent/src/control.cc

     
    9292  display::Window::slot_unschedule(rak::make_mem_fun(m_display, &display::Manager::unschedule)); 
    9393  display::Window::slot_adjust(rak::make_mem_fun(m_display, &display::Manager::adjust_layout)); 
    9494 
    95   m_core->get_poll_manager()->signal_interrupted().connect(sigc::mem_fun(*m_inputStdin, &input::InputEvent::event_read)); 
    96   m_core->get_poll_manager()->signal_interrupted().connect(sigc::ptr_fun(display::Canvas::do_update)); 
     95//   m_core->get_poll_manager()->signal_interrupted().connect(sigc::mem_fun(*m_inputStdin, &input::InputEvent::event_read)); 
     96//   m_core->get_poll_manager()->signal_interrupted().connect(sigc::ptr_fun(display::Canvas::do_update)); 
    9797  m_core->get_poll_manager()->get_http_stack()->set_user_agent(std::string(PACKAGE "/" VERSION "/") + torrent::version()); 
    9898 
    9999  m_core->initialize_second(); 
  • rtorrent/src/display/canvas.cc

     
    3636 
    3737#include "config.h" 
    3838 
     39#include <unistd.h> 
     40#include <sys/ioctl.h> 
     41 
    3942#include "canvas.h" 
    4043 
    4144namespace display { 
     
    7477  endwin(); 
    7578} 
    7679 
     80std::pair<int, int> 
     81Canvas::term_size() { 
     82  struct winsize ws; 
     83 
     84  if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == 0) 
     85    return std::pair<int, int>(ws.ws_col, ws.ws_row); 
     86  else 
     87    return std::pair<int, int>(80, 24); 
    7788} 
     89 
     90} 
  • rtorrent/src/display/manager.h

     
    6464  Manager(); 
    6565  ~Manager(); 
    6666 
     67  void                force_redraw(); 
     68 
    6769  iterator            insert(iterator pos, Window* w); 
    6870  iterator            erase(iterator pos); 
    6971  iterator            erase(Window* w); 
     
    8082 
    8183  void                schedule_update(); 
    8284 
     85  bool                m_forceRedraw; 
    8386  rak::timer          m_timeLastUpdate; 
    8487 
    8588  rak::priority_queue_default m_scheduler; 
  • rtorrent/src/display/canvas.h

     
    5151  void                refresh()                                               { wnoutrefresh(m_window); } 
    5252  static void         refresh_std()                                           { wnoutrefresh(stdscr); } 
    5353  void                redraw()                                                { redrawwin(m_window); } 
     54  static void         redraw_std()                                            { redrawwin(stdscr); } 
    5455 
    5556  void                resize(int w, int h)                                    { wresize(m_window, h, w); } 
    5657  void                resize(int x, int y, int w, int h); 
    5758 
     59  static void         resize_term(int x, int y)                               { resizeterm(y, x); } 
     60  static void         resize_term(std::pair<int, int> dim)                    { resizeterm(dim.second, dim.first); } 
     61 
    5862  int                 get_x()                                                 { int x, y; getyx(m_window, y, x); return x; } 
    5963  int                 get_y()                                                 { int x, y; getyx(m_window, y, x); return y; } 
    6064  int                 get_width()                                             { int x, y; getmaxyx(m_window, y, x); return x; } 
     
    116120  static int          get_screen_width()                                      { int x, y; getmaxyx(stdscr, y, x); return x; } 
    117121  static int          get_screen_height()                                     { int x, y; getmaxyx(stdscr, y, x); return y; } 
    118122 
     123  static std::pair<int, int> term_size(); 
     124 
    119125  static void         do_update()                                             { doupdate(); } 
    120126 
    121127private: 
  • rtorrent/src/display/manager.cc

     
    4747 
    4848namespace display { 
    4949 
    50 Manager::Manager() { 
     50Manager::Manager() : 
     51  m_forceRedraw(false) { 
    5152  m_taskUpdate.set_slot(rak::mem_fn(this, &Manager::receive_update)); 
    5253} 
    5354 
     
    5556  priority_queue_erase(&taskScheduler, &m_taskUpdate); 
    5657} 
    5758 
     59void 
     60Manager::force_redraw() { 
     61  m_forceRedraw = true; 
     62} 
     63 
     64 
    5865Manager::iterator 
    5966Manager::insert(iterator pos, Window* w) { 
    6067  return Base::insert(pos, w); 
     
    125132    h += (*itr)->get_min_height(); 
    126133 
    127134    (*itr)->resize(0, height, Canvas::get_screen_width(), h); 
     135    (*itr)->redraw(); 
    128136    (*itr)->mark_dirty(); 
    129137  } 
    130138} 
    131139 
    132140void 
    133141Manager::receive_update() { 
     142  if (m_forceRedraw) { 
     143    m_forceRedraw = false; 
     144 
     145    display::Canvas::resize_term(display::Canvas::term_size()); 
     146    Canvas::redraw_std(); 
     147    adjust_layout(); 
     148  } 
     149 
    134150  Canvas::refresh_std(); 
    135151 
    136152  rak::priority_queue_perform(&m_scheduler, cachedTime); 
  • rtorrent/src/main.cc

     
    167167    initialize_option_handler(control); 
    168168 
    169169    SignalHandler::set_ignore(SIGPIPE); 
    170     SignalHandler::set_handler(SIGINT,  sigc::mem_fun(control, &Control::receive_shutdown)); 
    171     SignalHandler::set_handler(SIGSEGV, sigc::bind(sigc::ptr_fun(&do_panic), SIGSEGV)); 
    172     SignalHandler::set_handler(SIGBUS,  sigc::bind(sigc::ptr_fun(&do_panic), SIGBUS)); 
    173     SignalHandler::set_handler(SIGFPE,  sigc::bind(sigc::ptr_fun(&do_panic), SIGFPE)); 
     170    SignalHandler::set_handler(SIGINT,   sigc::mem_fun(control, &Control::receive_shutdown)); 
     171    SignalHandler::set_handler(SIGWINCH, sigc::mem_fun(control->display(), &display::Manager::force_redraw)); 
     172    SignalHandler::set_handler(SIGSEGV,  sigc::bind(sigc::ptr_fun(&do_panic), SIGSEGV)); 
     173    SignalHandler::set_handler(SIGBUS,   sigc::bind(sigc::ptr_fun(&do_panic), SIGBUS)); 
     174    SignalHandler::set_handler(SIGFPE,   sigc::bind(sigc::ptr_fun(&do_panic), SIGFPE)); 
    174175 
    175176    control->core()->initialize_first(); 
    176177 
  • rtorrent/src/ui/root.cc

     
    108108  m_bindings['D']           = sigc::bind(sigc::mem_fun(*this, &Root::adjust_down_throttle), 50); 
    109109  m_bindings['C']           = sigc::bind(sigc::mem_fun(*this, &Root::adjust_down_throttle), -50); 
    110110 
    111   m_bindings[KEY_RESIZE]    = sigc::mem_fun(*m_control->display(), &display::Manager::adjust_layout); 
    112   m_bindings['\x11']        = sigc::mem_fun(*m_control, &Control::receive_shutdown); 
     111  //m_bindings[KEY_RESIZE]    = sigc::mem_fun(*m_control->display(), &display::Manager::adjust_layout); 
     112  m_bindings['\x0C']        = sigc::mem_fun(m_control->display(), &display::Manager::force_redraw); 
     113  m_bindings['\x11']        = sigc::mem_fun(m_control, &Control::receive_shutdown); 
    113114} 
    114115 
    115116void