diff --git a/src/core/poll.cc b/src/core/poll.cc index 32a613d9..6ee7d075 100644 --- a/src/core/poll.cc +++ b/src/core/poll.cc @@ -35,24 +35,22 @@ Poll::poll() { m_maxFd = select(m_maxFd + 1, &m_readSet, &m_writeSet, &m_exceptSet, &timeout); - if (m_maxFd >= 0) + if (m_maxFd >= 0) { work(); - else if (errno == EINTR) + } else if (errno == EINTR) { m_slotSelectInterrupted(); + work_input(); - else if (errno < 0) + } else if (errno < 0) { throw std::runtime_error("Poll::work(): select error"); + } } void Poll::work() { - if (FD_ISSET(0, &m_readSet)) { - int key; - - while ((key = getch()) != ERR) - m_slotReadStdin(key); - } + if (FD_ISSET(0, &m_readSet)) + work_input(); if (m_curlStack.is_busy()) m_curlStack.perform(); @@ -60,6 +58,14 @@ Poll::work() { torrent::work(&m_readSet, &m_writeSet, &m_exceptSet, m_maxFd); } +void +Poll::work_input() { + int key; + + while ((key = getch()) != ERR) + m_slotReadStdin(key); +} + void Poll::register_http() { torrent::Http::set_factory(sigc::bind(sigc::ptr_fun(&core::CurlGet::new_object), &m_curlStack)); diff --git a/src/core/poll.h b/src/core/poll.h index 8a760eb6..0c0b51fd 100644 --- a/src/core/poll.h +++ b/src/core/poll.h @@ -22,6 +22,7 @@ public: private: void work(); + void work_input(); SlotInt m_slotReadStdin; Slot m_slotSelectInterrupted; diff --git a/src/display/manager.cc b/src/display/manager.cc index 16215fd7..72ca6ec9 100644 --- a/src/display/manager.cc +++ b/src/display/manager.cc @@ -59,9 +59,8 @@ Manager::adjust_layout() { h += (*itr)->get_min_height(); (*itr)->resize(0, height, Canvas::get_screen_width(), h); + (*itr)->mark_dirty(); } - - std::for_each(begin(), end(), std::mem_fun(&Window::mark_dirty)); } void diff --git a/src/main.cc b/src/main.cc index 5c679952..95f6d889 100644 --- a/src/main.cc +++ b/src/main.cc @@ -74,9 +74,13 @@ main(int argc, char** argv) { input::Bindings inputMain; uiControl.get_input().push_back(&inputMain); + inputMain[KEY_RESIZE] = sigc::mem_fun(uiControl.get_display(), &display::Manager::adjust_layout); + poll.slot_read_stdin(sigc::mem_fun(uiControl.get_input(), &input::Manager::pressed)); poll.register_http(); + poll.slot_select_interrupted(sigc::ptr_fun(display::Canvas::do_update)); + torrent::initialize(); torrent::listen_open(6880, 6999); @@ -91,15 +95,14 @@ main(int argc, char** argv) { SignalHandler::set_handler(SIGINT, sigc::ptr_fun(&set_shutdown)); + uiControl.get_display().adjust_layout(); + while (!is_shutting_down || !torrent::get(torrent::SHUTDOWN_DONE)) { if (start_shutdown && !is_shutting_down) do_shutdown(); Timer::update(); - if (is_resized()) - uiControl.get_display().adjust_layout(); - uiControl.get_display().do_update(); poll.poll(); diff --git a/src/ui/download.cc b/src/ui/download.cc index e46b95e6..93c9762d 100644 --- a/src/ui/download.cc +++ b/src/ui/download.cc @@ -1,6 +1,7 @@ #include "config.h" #include +#include #include #include "input/bindings.h" @@ -25,8 +26,7 @@ Download::Download(DPtr d, Control* c) : m_window = new WPeerList(&m_peers, &m_focus); m_window->slot_chunks_total(sigc::mem_fun(m_download->get_download(), &torrent::Download::get_chunks_total)); - (*m_bindings)[KEY_UP] = sigc::mem_fun(*this, &Download::receive_prev); - (*m_bindings)[KEY_DOWN] = sigc::mem_fun(*this, &Download::receive_next); + bind_keys(m_bindings); m_download->get_download().peer_list(m_peers); @@ -98,6 +98,26 @@ Download::receive_peer_disconnected(torrent::Peer p) { m_peers.erase(itr); } +void +Download::receive_throttle(int t) { + m_status->mark_dirty(); + + torrent::set(torrent::THROTTLE_ROOT_CONST_RATE, torrent::get(torrent::THROTTLE_ROOT_CONST_RATE) + t * 1024); +} + +void +Download::bind_keys(input::Bindings* b) { + (*b)['a'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_throttle), 1); + (*b)['z'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_throttle), -1); + (*b)['s'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_throttle), 5); + (*b)['x'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_throttle), -5); + (*b)['d'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_throttle), 50); + (*b)['c'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_throttle), -50); + + (*b)[KEY_UP] = sigc::mem_fun(*this, &Download::receive_prev); + (*b)[KEY_DOWN] = sigc::mem_fun(*this, &Download::receive_next); +} + void Download::mark_dirty() { m_window->mark_dirty(); diff --git a/src/ui/download.h b/src/ui/download.h index 17970bf1..3c203564 100644 --- a/src/ui/download.h +++ b/src/ui/download.h @@ -42,6 +42,10 @@ private: void receive_peer_connected(torrent::Peer p); void receive_peer_disconnected(torrent::Peer p); + void receive_throttle(int t); + + void bind_keys(input::Bindings* b); + void mark_dirty(); DPtr m_download; diff --git a/src/ui/download_list.cc b/src/ui/download_list.cc index 5eba49c3..56cfb935 100644 --- a/src/ui/download_list.cc +++ b/src/ui/download_list.cc @@ -26,16 +26,7 @@ DownloadList::DownloadList(core::DownloadList* l, Control* c) : m_window = new WList(m_list, &m_focus); - (*m_bindings)[KEY_UP] = sigc::mem_fun(*this, &DownloadList::receive_prev); - (*m_bindings)[KEY_DOWN] = sigc::mem_fun(*this, &DownloadList::receive_next); - (*m_bindings)[KEY_RIGHT] = sigc::mem_fun(*this, &DownloadList::receive_view_download); - - (*m_bindings)['a'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), 1); - (*m_bindings)['z'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), -1); - (*m_bindings)['s'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), 5); - (*m_bindings)['x'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), -5); - (*m_bindings)['d'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), 50); - (*m_bindings)['c'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), -50); + bind_keys(m_bindings); } DownloadList::~DownloadList() { @@ -117,6 +108,21 @@ DownloadList::receive_throttle(int t) { torrent::set(torrent::THROTTLE_ROOT_CONST_RATE, torrent::get(torrent::THROTTLE_ROOT_CONST_RATE) + t * 1024); } +void +DownloadList::bind_keys(input::Bindings* b) { + (*b)['a'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), 1); + (*b)['z'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), -1); + (*b)['s'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), 5); + (*b)['x'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), -5); + (*b)['d'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), 50); + (*b)['c'] = sigc::bind(sigc::mem_fun(*this, &DownloadList::receive_throttle), -50); + + (*b)[KEY_UP] = sigc::mem_fun(*this, &DownloadList::receive_prev); + (*b)[KEY_DOWN] = sigc::mem_fun(*this, &DownloadList::receive_next); + (*b)[KEY_RIGHT] = sigc::mem_fun(*this, &DownloadList::receive_view_download); + +} + void DownloadList::mark_dirty() { m_window->mark_dirty(); diff --git a/src/ui/download_list.h b/src/ui/download_list.h index 35ec2759..4df19f4e 100644 --- a/src/ui/download_list.h +++ b/src/ui/download_list.h @@ -38,6 +38,8 @@ private: void receive_throttle(int t); + void bind_keys(input::Bindings* b); + void mark_dirty(); WList* m_window;