diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 320ae3546..531ca0b07 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -261,12 +261,15 @@ MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine) : QMa
autoShutdownGroup->addAction(actionAutoExit_qBittorrent);
autoShutdownGroup->addAction(actionAutoShutdown_system);
autoShutdownGroup->addAction(actionAutoSuspend_system);
+ autoShutdownGroup->addAction(actionAutoHibernate_system);
#if (!defined(Q_OS_UNIX) || defined(Q_OS_MAC)) || defined(QT_DBUS_LIB)
actionAutoShutdown_system->setChecked(pref.shutdownWhenDownloadsComplete());
actionAutoSuspend_system->setChecked(pref.suspendWhenDownloadsComplete());
+ actionAutoHibernate_system->setChecked(pref.hibernateWhenDownloadsComplete());
#else
actionAutoShutdown_system->setDisabled(true);
actionAutoSuspend_system->setDisabled(true);
+ actionAutoHibernate_system->setDisabled(true);
#endif
actionAutoExit_qBittorrent->setChecked(pref.shutdownqBTWhenDownloadsComplete());
@@ -1414,6 +1417,12 @@ void MainWindow::on_actionAutoSuspend_system_toggled(bool enabled)
Preferences().setSuspendWhenDownloadsComplete(enabled);
}
+void MainWindow::on_actionAutoHibernate_system_toggled(bool enabled)
+{
+ qDebug() << Q_FUNC_INFO << enabled;
+ Preferences().setHibernateWhenDownloadsComplete(enabled);
+}
+
void MainWindow::on_actionAutoShutdown_system_toggled(bool enabled)
{
qDebug() << Q_FUNC_INFO << enabled;
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 4c38e33a2..5b8f35033 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -211,6 +211,7 @@ private slots:
void on_actionExecution_Logs_triggered(bool checked);
void on_actionAutoExit_qBittorrent_toggled(bool );
void on_actionAutoSuspend_system_toggled(bool );
+ void on_actionAutoHibernate_system_toggled(bool );
void on_actionAutoShutdown_system_toggled(bool );
// Check for active torrents and set preventing from suspend state
void checkForActiveTorrents();
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 92fa14821..739efe265 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -67,6 +67,7 @@
+
@@ -352,6 +353,14 @@
Suspend system
+
+
+ true
+
+
+ Hibernate system
+
+
true
diff --git a/src/misc.cpp b/src/misc.cpp
index 7addb0d86..89208b71d 100644
--- a/src/misc.cpp
+++ b/src/misc.cpp
@@ -81,29 +81,38 @@ static struct { const char *source; const char *comment; } units[] = {
};
#ifndef DISABLE_GUI
-void misc::shutdownComputer(bool sleep) {
+void misc::shutdownComputer(shutDownAction action) {
#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB)
// Use dbus to power off / suspend the system
- if (sleep) {
+ if (action != SHUTDOWN_COMPUTER) {
// Some recent systems use systemd's logind
QDBusInterface login1Iface("org.freedesktop.login1", "/org/freedesktop/login1",
"org.freedesktop.login1.Manager", QDBusConnection::systemBus());
if (login1Iface.isValid()) {
- login1Iface.call("Suspend", false);
+ if (action == SUSPEND_COMPUTER)
+ login1Iface.call("Suspend", false);
+ else
+ login1Iface.call("Hibernate", false);
return;
}
// Else, other recent systems use UPower
QDBusInterface upowerIface("org.freedesktop.UPower", "/org/freedesktop/UPower",
"org.freedesktop.UPower", QDBusConnection::systemBus());
if (upowerIface.isValid()) {
- upowerIface.call("Suspend");
+ if (action == SUSPEND_COMPUTER)
+ upowerIface.call("Suspend");
+ else
+ upowerIface.call("Hibernate");
return;
}
// HAL (older systems)
QDBusInterface halIface("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer",
"org.freedesktop.Hal.Device.SystemPowerManagement",
QDBusConnection::systemBus());
- halIface.call("Suspend", 5);
+ if (action == SUSPEND_COMPUTER)
+ halIface.call("Suspend", 5);
+ else
+ halIface.call("Hibernate");
} else {
// Some recent systems use systemd's logind
QDBusInterface login1Iface("org.freedesktop.login1", "/org/freedesktop/login1",
@@ -128,7 +137,7 @@ void misc::shutdownComputer(bool sleep) {
#endif
#ifdef Q_OS_MAC
AEEventID EventToSend;
- if (sleep)
+ if (action != SHUTDOWN_COMPUTER)
EventToSend = kAESleep;
else
EventToSend = kAEShutDown;
@@ -189,8 +198,10 @@ void misc::shutdownComputer(bool sleep) {
if (GetLastError() != ERROR_SUCCESS)
return;
- if (sleep)
+ if (action == SUSPEND_COMPUTER)
SetSuspendState(false, false, false);
+ else if (action == HIBERNATE_COMPUTER)
+ SetSuspendState(true, false, false);
else
InitiateSystemShutdownA(0, QCoreApplication::translate("misc", "qBittorrent will shutdown the computer now because all downloads are complete.").toLocal8Bit().data(), 10, true, false);
diff --git a/src/misc.h b/src/misc.h
index e25a7929b..00dae66af 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -48,6 +48,7 @@
#endif
const qlonglong MAX_ETA = 8640000;
+enum shutDownAction { NO_SHUTDOWN, SHUTDOWN_COMPUTER, SUSPEND_COMPUTER, HIBERNATE_COMPUTER };
/* Miscellaneaous functions that can be useful */
namespace misc
@@ -75,7 +76,7 @@ namespace misc
}
#ifndef DISABLE_GUI
- void shutdownComputer(bool sleep=false);
+ void shutdownComputer(shutDownAction action=SHUTDOWN_COMPUTER);
#endif
QString parseHtmlLinks(const QString &raw_text);
diff --git a/src/preferences/preferences.h b/src/preferences/preferences.h
index 4bb10456d..889696119 100755
--- a/src/preferences/preferences.h
+++ b/src/preferences/preferences.h
@@ -974,6 +974,14 @@ public:
void setSuspendWhenDownloadsComplete(bool suspend) {
setValue(QString::fromUtf8("Preferences/Downloads/AutoSuspendOnCompletion"), suspend);
}
+
+ bool hibernateWhenDownloadsComplete() const {
+ return value(QString::fromUtf8("Preferences/Downloads/AutoHibernateOnCompletion"), false).toBool();
+ }
+
+ void setHibernateWhenDownloadsComplete(bool hibernate) {
+ setValue(QString::fromUtf8("Preferences/Downloads/AutoHibernateOnCompletion"), hibernate);
+ }
bool shutdownqBTWhenDownloadsComplete() const {
return value(QString::fromUtf8("Preferences/Downloads/AutoShutDownqBTOnCompletion"), false).toBool();
diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/qtlibtorrent/qbtsession.cpp
index 97a3b0638..d1908e2e9 100755
--- a/src/qtlibtorrent/qbtsession.cpp
+++ b/src/qtlibtorrent/qbtsession.cpp
@@ -197,8 +197,8 @@ QBtSession::~QBtSession() {
qDebug("BTSession destructor OUT");
#ifndef DISABLE_GUI
if (m_shutdownAct != NO_SHUTDOWN) {
- qDebug() << "Sending computer shutdown/suspend signal...";
- misc::shutdownComputer(m_shutdownAct == SUSPEND_COMPUTER);
+ qDebug() << "Sending computer shutdown/suspend/hibernate signal...";
+ misc::shutdownComputer(m_shutdownAct);
}
#endif
}
@@ -2282,7 +2282,8 @@ void QBtSession::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert*
#ifndef DISABLE_GUI
bool will_shutdown = (pref.shutdownWhenDownloadsComplete() ||
pref.shutdownqBTWhenDownloadsComplete() ||
- pref.suspendWhenDownloadsComplete())
+ pref.suspendWhenDownloadsComplete() ||
+ pref.hibernateWhenDownloadsComplete())
&& !hasDownloadingTorrents();
#else
bool will_shutdown = false;
@@ -2300,11 +2301,14 @@ void QBtSession::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert*
// Auto-Shutdown
if (will_shutdown) {
bool suspend = pref.suspendWhenDownloadsComplete();
+ bool hibernate = pref.hibernateWhenDownloadsComplete();
bool shutdown = pref.shutdownWhenDownloadsComplete();
// Confirm shutdown
QString confirm_msg;
if (suspend) {
confirm_msg = tr("The computer will now go to sleep mode unless you cancel within the next 15 seconds...");
+ } else if (hibernate) {
+ confirm_msg = tr("The computer will now go to hibernation mode unless you cancel within the next 15 seconds...");
} else if (shutdown) {
confirm_msg = tr("The computer will now be switched off unless you cancel within the next 15 seconds...");
} else {
@@ -2313,14 +2317,17 @@ void QBtSession::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert*
if (!ShutdownConfirmDlg::askForConfirmation(confirm_msg))
return;
// Actually shut down
- if (suspend || shutdown) {
+ if (suspend || hibernate || shutdown) {
qDebug("Preparing for auto-shutdown because all downloads are complete!");
// Disabling it for next time
pref.setShutdownWhenDownloadsComplete(false);
pref.setSuspendWhenDownloadsComplete(false);
+ pref.setHibernateWhenDownloadsComplete(false);
// Make sure preferences are synced before exiting
if (suspend)
m_shutdownAct = SUSPEND_COMPUTER;
+ else if (hibernate)
+ m_shutdownAct = HIBERNATE_COMPUTER;
else
m_shutdownAct = SHUTDOWN_COMPUTER;
}
diff --git a/src/qtlibtorrent/qbtsession.h b/src/qtlibtorrent/qbtsession.h
index d2510275a..0defbe060 100755
--- a/src/qtlibtorrent/qbtsession.h
+++ b/src/qtlibtorrent/qbtsession.h
@@ -53,6 +53,7 @@
#include "qtorrenthandle.h"
#include "trackerinfos.h"
#include "alertdispatcher.h"
+#include "misc.h"
#define MAX_SAMPLES 20
@@ -82,7 +83,6 @@ public:
private:
explicit QBtSession();
static QBtSession* m_instance;
- enum shutDownAction { NO_SHUTDOWN, SHUTDOWN_COMPUTER, SUSPEND_COMPUTER };
public:
static QBtSession* instance();