mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-11 16:49:22 +00:00
Merge pull request #446 from zp/daemon
Allow rtorrent to run as a daemon, slightly modified version of #111
This commit is contained in:
@@ -266,6 +266,8 @@ initialize_command_local() {
|
|||||||
|
|
||||||
CMD2_ANY_VALUE_V ("system.umask.set", std::bind(&umask, std::placeholders::_2));
|
CMD2_ANY_VALUE_V ("system.umask.set", std::bind(&umask, std::placeholders::_2));
|
||||||
|
|
||||||
|
CMD2_VAR_BOOL ("system.use_daemon", false);
|
||||||
|
|
||||||
CMD2_ANY ("system.cwd", std::bind(&system_get_cwd));
|
CMD2_ANY ("system.cwd", std::bind(&system_get_cwd));
|
||||||
CMD2_ANY_STRING ("system.cwd.set", std::bind(&system_set_cwd, std::placeholders::_2));
|
CMD2_ANY_STRING ("system.cwd.set", std::bind(&system_set_cwd, std::placeholders::_2));
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -118,7 +118,9 @@ Control::initialize() {
|
|||||||
|
|
||||||
m_ui->init(this);
|
m_ui->init(this);
|
||||||
|
|
||||||
m_inputStdin->insert(torrent::main_thread()->poll());
|
if(!display::Canvas::daemon()) {
|
||||||
|
m_inputStdin->insert(torrent::main_thread()->poll());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -128,7 +130,9 @@ Control::cleanup() {
|
|||||||
|
|
||||||
priority_queue_erase(&taskScheduler, &m_taskShutdown);
|
priority_queue_erase(&taskScheduler, &m_taskShutdown);
|
||||||
|
|
||||||
m_inputStdin->remove(torrent::main_thread()->poll());
|
if(!display::Canvas::daemon()) {
|
||||||
|
m_inputStdin->remove(torrent::main_thread()->poll());
|
||||||
|
}
|
||||||
|
|
||||||
m_core->download_store()->disable();
|
m_core->download_store()->disable();
|
||||||
|
|
||||||
|
|||||||
+52
-36
@@ -41,54 +41,63 @@
|
|||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <torrent/exceptions.h>
|
#include <torrent/exceptions.h>
|
||||||
|
|
||||||
|
#include "rpc/parse_commands.h"
|
||||||
|
|
||||||
#include "canvas.h"
|
#include "canvas.h"
|
||||||
|
|
||||||
namespace display {
|
namespace display {
|
||||||
|
|
||||||
bool Canvas::m_isInitialized = false;
|
bool Canvas::m_isInitialized = false;
|
||||||
|
bool Canvas::m_isDaemon = false;
|
||||||
|
|
||||||
Canvas::Canvas(int x, int y, int width, int height) :
|
Canvas::Canvas(int x, int y, int width, int height) {
|
||||||
m_window(newwin(height, width, y, x)) {
|
if (!m_isDaemon) {
|
||||||
|
m_window = newwin(height, width, y, x);
|
||||||
|
|
||||||
if (m_window == NULL)
|
if (m_window == NULL)
|
||||||
throw torrent::internal_error("Could not allocate ncurses canvas.");
|
throw torrent::internal_error("Could not allocate ncurses canvas.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Canvas::resize(int x, int y, int w, int h) {
|
Canvas::resize(int x, int y, int w, int h) {
|
||||||
wresize(m_window, h, w);
|
if (!m_isDaemon) {
|
||||||
mvwin(m_window, y, x);
|
wresize(m_window, h, w);
|
||||||
|
mvwin(m_window, y, x);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Canvas::print_attributes(unsigned int x, unsigned int y, const char* first, const char* last, const attributes_list* attributes) {
|
Canvas::print_attributes(unsigned int x, unsigned int y, const char* first, const char* last, const attributes_list* attributes) {
|
||||||
move(x, y);
|
if (!m_isDaemon) {
|
||||||
|
move(x, y);
|
||||||
|
|
||||||
attr_t org_attr;
|
attr_t org_attr;
|
||||||
short org_pair;
|
short org_pair;
|
||||||
wattr_get(m_window, &org_attr, &org_pair, NULL);
|
wattr_get(m_window, &org_attr, &org_pair, NULL);
|
||||||
|
|
||||||
attributes_list::const_iterator attrItr = attributes->begin();
|
attributes_list::const_iterator attrItr = attributes->begin();
|
||||||
wattr_set(m_window, Attributes::a_normal, Attributes::color_default, NULL);
|
wattr_set(m_window, Attributes::a_normal, Attributes::color_default, NULL);
|
||||||
|
|
||||||
while (first != last) {
|
while (first != last) {
|
||||||
const char* next = last;
|
const char* next = last;
|
||||||
|
|
||||||
if (attrItr != attributes->end()) {
|
if (attrItr != attributes->end()) {
|
||||||
next = attrItr->position();
|
next = attrItr->position();
|
||||||
|
|
||||||
if (first >= next) {
|
if (first >= next) {
|
||||||
wattr_set(m_window, attrItr->attributes(), attrItr->colors(), NULL);
|
wattr_set(m_window, attrItr->attributes(), attrItr->colors(), NULL);
|
||||||
++attrItr;
|
++attrItr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print("%.*s", next - first, first);
|
||||||
|
first = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
print("%.*s", next - first, first);
|
// Reset the color.
|
||||||
first = next;
|
wattr_set(m_window, org_attr, org_pair, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the color.
|
|
||||||
wattr_set(m_window, org_attr, org_pair, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -96,14 +105,18 @@ Canvas::initialize() {
|
|||||||
if (m_isInitialized)
|
if (m_isInitialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_isDaemon = rpc::call_command_value("system.use_daemon");
|
||||||
|
|
||||||
m_isInitialized = true;
|
m_isInitialized = true;
|
||||||
|
|
||||||
initscr();
|
if (!m_isDaemon) {
|
||||||
raw();
|
initscr();
|
||||||
noecho();
|
raw();
|
||||||
nodelay(stdscr, TRUE);
|
noecho();
|
||||||
keypad(stdscr, TRUE);
|
nodelay(stdscr, TRUE);
|
||||||
curs_set(0);
|
keypad(stdscr, TRUE);
|
||||||
|
curs_set(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -113,18 +126,21 @@ Canvas::cleanup() {
|
|||||||
|
|
||||||
m_isInitialized = false;
|
m_isInitialized = false;
|
||||||
|
|
||||||
noraw();
|
if (!m_isDaemon) {
|
||||||
endwin();
|
noraw();
|
||||||
|
endwin();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int, int>
|
std::pair<int, int>
|
||||||
Canvas::term_size() {
|
Canvas::term_size() {
|
||||||
struct winsize ws;
|
struct winsize ws;
|
||||||
|
|
||||||
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == 0)
|
if (!m_isDaemon) {
|
||||||
return std::pair<int, int>(ws.ws_col, ws.ws_row);
|
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == 0)
|
||||||
else
|
return std::pair<int, int>(ws.ws_col, ws.ws_row);
|
||||||
return std::pair<int, int>(80, 24);
|
}
|
||||||
|
return std::pair<int, int>(80, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-32
@@ -49,37 +49,37 @@ public:
|
|||||||
typedef std::vector<Attributes> attributes_list;
|
typedef std::vector<Attributes> attributes_list;
|
||||||
|
|
||||||
Canvas(int x = 0, int y = 0, int width = 0, int height = 0);
|
Canvas(int x = 0, int y = 0, int width = 0, int height = 0);
|
||||||
~Canvas() { delwin(m_window); }
|
~Canvas() { if (!m_isDaemon) { delwin(m_window); } }
|
||||||
|
|
||||||
void refresh() { wnoutrefresh(m_window); }
|
void refresh() { if (!m_isDaemon) { wnoutrefresh(m_window); } }
|
||||||
static void refresh_std() { wnoutrefresh(stdscr); }
|
static void refresh_std() { if (!m_isDaemon) { wnoutrefresh(stdscr); } }
|
||||||
void redraw() { redrawwin(m_window); }
|
void redraw() { if (!m_isDaemon) { redrawwin(m_window); } }
|
||||||
static void redraw_std() { redrawwin(stdscr); }
|
static void redraw_std() { if (!m_isDaemon) { redrawwin(stdscr); } }
|
||||||
|
|
||||||
void resize(int w, int h) { wresize(m_window, h, w); }
|
void resize(int w, int h) { if (!m_isDaemon) { wresize(m_window, h, w); } }
|
||||||
void resize(int x, int y, int w, int h);
|
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(int x, int y) { if (!m_isDaemon) { resizeterm(y, x); } }
|
||||||
static void resize_term(std::pair<int, int> dim) { resizeterm(dim.second, dim.first); }
|
static void resize_term(std::pair<int, int> dim) { if (!m_isDaemon) { resizeterm(dim.second, dim.first); } }
|
||||||
|
|
||||||
unsigned int get_x() { int x, __UNUSED y; getyx(m_window, y, x); return x; }
|
unsigned int get_x() { int x, __UNUSED y; if (!m_isDaemon) { getyx(m_window, y, x); } else { x=1; } return x; }
|
||||||
unsigned int get_y() { int x, y; getyx(m_window, y, x); return y; }
|
unsigned int get_y() { int x, y; if (!m_isDaemon) { getyx(m_window, y, x); } else { y=1; } return y; }
|
||||||
|
|
||||||
unsigned int width() { int x, __UNUSED y; getmaxyx(m_window, y, x); return x; }
|
unsigned int width() { int x, __UNUSED y; if (!m_isDaemon) { getmaxyx(m_window, y, x); } else { x=80; } return x; }
|
||||||
unsigned int height() { int x, y; getmaxyx(m_window, y, x); return y; }
|
unsigned int height() { int x, y; if (!m_isDaemon) { getmaxyx(m_window, y, x); } else { y=24; } return y; }
|
||||||
|
|
||||||
void move(unsigned int x, unsigned int y) { wmove(m_window, y, x); }
|
void move(unsigned int x, unsigned int y) { if (!m_isDaemon) { wmove(m_window, y, x); } }
|
||||||
|
|
||||||
chtype get_background() { return getbkgd(m_window); }
|
chtype get_background() { chtype bg=0; if (!m_isDaemon) { bg=getbkgd(m_window); } return bg; }
|
||||||
void set_background(chtype c) { return wbkgdset(m_window, c); }
|
void set_background(chtype c) { if (!m_isDaemon) { return wbkgdset(m_window, c); } }
|
||||||
|
|
||||||
void erase() { werase(m_window); }
|
void erase() { if (!m_isDaemon) { werase(m_window); } }
|
||||||
static void erase_std() { werase(stdscr); }
|
static void erase_std() { if (!m_isDaemon) { werase(stdscr); } }
|
||||||
|
|
||||||
void print_border(chtype ls, chtype rs,
|
void print_border(chtype ls, chtype rs,
|
||||||
chtype ts, chtype bs,
|
chtype ts, chtype bs,
|
||||||
chtype tl, chtype tr,
|
chtype tl, chtype tr,
|
||||||
chtype bl, chtype br) { wborder(m_window, ls, rs, ts, bs, tl, tr, bl, br); }
|
chtype bl, chtype br) { if (!m_isDaemon) { wborder(m_window, ls, rs, ts, bs, tl, tr, bl, br); } }
|
||||||
|
|
||||||
// The format string is non-const, but that will not be a problem
|
// The format string is non-const, but that will not be a problem
|
||||||
// since the string shall always be a C string choosen at
|
// since the string shall always be a C string choosen at
|
||||||
@@ -90,29 +90,32 @@ public:
|
|||||||
|
|
||||||
void print_attributes(unsigned int x, unsigned int y, const char* first, const char* last, const attributes_list* attributes);
|
void print_attributes(unsigned int x, unsigned int y, const char* first, const char* last, const attributes_list* attributes);
|
||||||
|
|
||||||
void print_char(const chtype ch) { waddch(m_window, ch); }
|
void print_char(const chtype ch) { if (!m_isDaemon) { waddch(m_window, ch); } }
|
||||||
void print_char(unsigned int x, unsigned int y, const chtype ch) { mvwaddch(m_window, y, x, ch); }
|
void print_char(unsigned int x, unsigned int y, const chtype ch) { if (!m_isDaemon) { mvwaddch(m_window, y, x, ch); } }
|
||||||
|
|
||||||
void set_attr(unsigned int x, unsigned int y, unsigned int n, int attr, int color) { mvwchgat(m_window, y, x, n, attr, color, NULL); }
|
void set_attr(unsigned int x, unsigned int y, unsigned int n, int attr, int color) { if (!m_isDaemon) { mvwchgat(m_window, y, x, n, attr, color, NULL); } }
|
||||||
|
|
||||||
void set_default_attributes(int attr) { (void)wattrset(m_window, attr); }
|
void set_default_attributes(int attr) { if (!m_isDaemon) { (void)wattrset(m_window, attr); } }
|
||||||
|
|
||||||
// Initialize stdscr.
|
// Initialize stdscr.
|
||||||
static void initialize();
|
static void initialize();
|
||||||
static void cleanup();
|
static void cleanup();
|
||||||
|
|
||||||
static int get_screen_width() { int x, __UNUSED y; getmaxyx(stdscr, y, x); return x; }
|
static int get_screen_width() { int x, __UNUSED y; if (!m_isDaemon) { getmaxyx(stdscr, y, x); } else { x=80; } return x; }
|
||||||
static int get_screen_height() { int x, y; getmaxyx(stdscr, y, x); return y; }
|
static int get_screen_height() { int x, y; if (!m_isDaemon) { getmaxyx(stdscr, y, x); } else { y=24;} return y; }
|
||||||
|
|
||||||
static std::pair<int, int> term_size();
|
static std::pair<int, int> term_size();
|
||||||
|
|
||||||
static void do_update() { doupdate(); }
|
static void do_update() { if (!m_isDaemon) { doupdate(); } }
|
||||||
|
|
||||||
|
static bool daemon() { return m_isDaemon; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Canvas(const Canvas&);
|
Canvas(const Canvas&);
|
||||||
void operator = (const Canvas&);
|
void operator = (const Canvas&);
|
||||||
|
|
||||||
static bool m_isInitialized;
|
static bool m_isInitialized;
|
||||||
|
static bool m_isDaemon;
|
||||||
|
|
||||||
WINDOW* m_window;
|
WINDOW* m_window;
|
||||||
};
|
};
|
||||||
@@ -121,19 +124,23 @@ inline void
|
|||||||
Canvas::print(const char* str, ...) {
|
Canvas::print(const char* str, ...) {
|
||||||
va_list arglist;
|
va_list arglist;
|
||||||
|
|
||||||
va_start(arglist, str);
|
if (!m_isDaemon) {
|
||||||
vw_printw(m_window, const_cast<char*>(str), arglist);
|
va_start(arglist, str);
|
||||||
va_end(arglist);
|
vw_printw(m_window, const_cast<char*>(str), arglist);
|
||||||
|
va_end(arglist);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
Canvas::print(unsigned int x, unsigned int y, const char* str, ...) {
|
Canvas::print(unsigned int x, unsigned int y, const char* str, ...) {
|
||||||
va_list arglist;
|
va_list arglist;
|
||||||
|
|
||||||
va_start(arglist, str);
|
if (!m_isDaemon) {
|
||||||
wmove(m_window, y, x);
|
va_start(arglist, str);
|
||||||
vw_printw(m_window, const_cast<char*>(str), arglist);
|
wmove(m_window, y, x);
|
||||||
va_end(arglist);
|
vw_printw(m_window, const_cast<char*>(str), arglist);
|
||||||
|
va_end(arglist);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user