From a0098f0737d50e25d0493317190808eaa960b1d6 Mon Sep 17 00:00:00 2001 From: Dominic Maluski Date: Mon, 1 Jun 2026 16:54:37 -0700 Subject: [PATCH 1/4] Provisional changes to qt/restoredialog.py to prevent user from exiting restoration early and causing problems. --- CHANGELOG.md | 1 + qt/restoredialog.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d2f3b2ac..85341f69e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ General Public License v2 (GPLv2). See LICENSES directory or go to ## Fixed - Prevent Back In Time crash when a plugin fails ([#2447](https://github.com/bit-team/backintime/issues/2447)) +- Prevent user from exiting the restore window while running causing backintime to freeze. (Dominic Maluski, @maluskid, [#2503](https://github.com/bit-team/backintime/issues/2503)) ## [1.6.1] (2026-02-10) diff --git a/qt/restoredialog.py b/qt/restoredialog.py index 908eda2f7..970a3a09d 100644 --- a/qt/restoredialog.py +++ b/qt/restoredialog.py @@ -9,6 +9,7 @@ # General Public License v2 (GPLv2). See LICENSES directory or go to # . """Module offering RestoreDialog""" +import time from pathlib import Path from PyQt6.QtGui import QDesktopServices from PyQt6.QtWidgets import (QDialog, @@ -106,6 +107,23 @@ def exec(self): def _slot_thread_finished(self): self._btn_close.setEnabled(True) + def closeEvent(self, event): + """ + intercept close event to prevent cancelling restoration early + this provides protection against upper corner x as well as + alt-f4 key presses + """ + # Check if close button is enabled to avoid using new variable + # Could add a boolean to __init__ for easier readability + if not self._btn_close.isEnabled(): + messagebox.critical( + self, + _("A critical process is currently running. Window " + "cannot be closed until restoration is finished.") + ) + event.ignore() + else: + event.accept() class RestoreThread(QThread): """ From 7793429a868124fd7c0f58db68cf4b29497c2827 Mon Sep 17 00:00:00 2001 From: Dominic Maluski Date: Mon, 1 Jun 2026 17:09:06 -0700 Subject: [PATCH 2/4] removed unneeded import time used for testing --- qt/restoredialog.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qt/restoredialog.py b/qt/restoredialog.py index 970a3a09d..4d9344db0 100644 --- a/qt/restoredialog.py +++ b/qt/restoredialog.py @@ -9,7 +9,6 @@ # General Public License v2 (GPLv2). See LICENSES directory or go to # . """Module offering RestoreDialog""" -import time from pathlib import Path from PyQt6.QtGui import QDesktopServices from PyQt6.QtWidgets import (QDialog, From 76440926a11747339560319ebe25def6e3114c31 Mon Sep 17 00:00:00 2001 From: Dominic Maluski Date: Mon, 1 Jun 2026 20:29:58 -0700 Subject: [PATCH 3/4] Added flake-8 exception for closeEvent() function name to properly override QT's closeEvent() function. --- qt/restoredialog.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qt/restoredialog.py b/qt/restoredialog.py index 4d9344db0..4a1fd6cc8 100644 --- a/qt/restoredialog.py +++ b/qt/restoredialog.py @@ -106,7 +106,7 @@ def exec(self): def _slot_thread_finished(self): self._btn_close.setEnabled(True) - def closeEvent(self, event): + def closeEvent(self, event): # noqa: N802 """ intercept close event to prevent cancelling restoration early this provides protection against upper corner x as well as @@ -124,6 +124,7 @@ def closeEvent(self, event): else: event.accept() + class RestoreThread(QThread): """ run restore in a separate Thread to prevent GUI freeze and speed up restore From 1071652ed3ca5d17d35f78bda3b8b25ceabb407f Mon Sep 17 00:00:00 2001 From: Dominic Maluski Date: Mon, 1 Jun 2026 20:42:18 -0700 Subject: [PATCH 4/4] Fixed spelling error in comment --- qt/restoredialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qt/restoredialog.py b/qt/restoredialog.py index 4a1fd6cc8..e4dc65702 100644 --- a/qt/restoredialog.py +++ b/qt/restoredialog.py @@ -108,7 +108,7 @@ def _slot_thread_finished(self): def closeEvent(self, event): # noqa: N802 """ - intercept close event to prevent cancelling restoration early + intercept close event to prevent canceling restoration early this provides protection against upper corner x as well as alt-f4 key presses """