aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/release-qt5.yml2
-rw-r--r--.github/workflows/release.yml1
-rw-r--r--README.md71
-rw-r--r--resource/appstream/com.bktus.gpgfrontend.appdata.xml26
-rw-r--r--resource/appstream/com.bktus.gpgfrontend.metainfo.xml26
-rw-r--r--src/core/thread/Task.cpp2
-rw-r--r--src/core/thread/TaskRunner.cpp27
7 files changed, 88 insertions, 67 deletions
diff --git a/.github/workflows/release-qt5.yml b/.github/workflows/release-qt5.yml
index 0a8e1688..d0f7b633 100644
--- a/.github/workflows/release-qt5.yml
+++ b/.github/workflows/release-qt5.yml
@@ -45,7 +45,7 @@ jobs:
build:
strategy:
matrix:
- os: ["ubuntu-22.04", "windows-2019"]
+ os: ["ubuntu-22.04", "windows-2022"]
runs-on: ${{ matrix.os }}
continue-on-error: true
steps:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index a11b27b3..852a9580 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -52,7 +52,6 @@ jobs:
"macos-13",
"macos-14",
"macos-15",
- "windows-2019",
"windows-2022",
]
runs-on: ${{ matrix.os }}
diff --git a/README.md b/README.md
index fb5c0d68..3f888ff0 100644
--- a/README.md
+++ b/README.md
@@ -7,39 +7,38 @@
[![Build Nightly](https://github.com/saturneric/GpgFrontend/actions/workflows/testing-nightly.yml/badge.svg?branch=develop)](https://github.com/saturneric/GpgFrontend/actions/workflows/testing-nightly.yml)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/saturneric/GpgFrontend)
-**GpgFrontend** is a modern, cross-platform, open-source GUI for OpenPGP
-encryption—simple enough for beginners, powerful enough for experts, and
-portable enough for everyone who values security and flexibility.
+GpgFrontend is a modern, cross-platform open-source GUI for OpenPGP encryption.
+It’s easy enough for beginners, powerful enough for experts and portable for
+anyone who values security and flexibility.
<img width="100" height="100" align="right" style="position: absolute;right: 0;padding: 12px;top:12px;z-index: 1000;" src="https://image.cdn.bktus.com/i/2024/02/24/248b2e18-a120-692e-e6bc-42ca30be9011.webp" alt="GpgFrontend"/>
**Key Features:**
-- **One-click Encryption & Signing** — Quickly encrypt, decrypt, and digitally
- sign your texts, files, and emails with ease.
-- **Easy Installation** — Available via Homebrew, Flatpak, GitHub Releases,
- winget, AUR, Microsoft Store, and more.
-- **True Cross-platform Experience** — Native support for Windows, macOS, Linux,
- and buildable on FreeBSD.
-- **Fully Portable Across OS** — Run directly from a USB drive; seamlessly move
- your keys and settings between Windows and Linux without hassle.
-- **Secure & Simple Key Transfer** — Easily move your keys and configurations
- safely between devices.
-- **Multiple Independent Key Databases** — Effortlessly handle keys and
- identities for different roles, projects, or teams.
-- **Comprehensive Algorithm Support** — RSA, DSA, EdDSA, ECDSA (NIST,
- Brainpool), ECDH, and many more via the latest GnuPG.
-
-❤️ **Like GpgFrontend?**
-Star ⭐ it on GitHub, report issues, or even contribute code—every action
-supports privacy and security for all.
+1. One-click encryption and signing: Quickly encrypt, decrypt and digitally sign
+ texts, files and emails
+2. Easy installation: Available via Homebrew, Flatpak, GitHub Releases, winget,
+ AUR, Microsoft Store and more
+3. True cross-platform experience: Native support for Windows, macOS and Linux;
+ can also be built on FreeBSD
+4. Fully portable: Run directly from a USB drive and move keys and settings
+ between Windows and Linux without hassle
+5. Secure key transfer: Safely migrate your keys and configurations across
+ devices
+6. Multiple independent key databases: Manage keys and identities separately for
+ different roles, projects or teams
+7. Comprehensive algorithm support: Includes RSA, DSA, EdDSA, ECDSA (NIST,
+ Brainpool), ECDH and other algorithms via the latest GnuPG
+
+If you like GpgFrontend, please star ⭐ it on GitHub, report issues or contribute
+code to help advance privacy and security for everyone.
## Table of Contents
- [GpgFrontend](#gpgfrontend)
- [Table of Contents](#table-of-contents)
- [User Manual](#user-manual)
- - [Developer Document](#developer-document)
+ - [Developer Wiki](#developer-wiki)
- [Language Support](#language-support)
- [Supported Languages](#supported-languages)
- [Modules](#modules)
@@ -52,22 +51,26 @@ supports privacy and security for all.
## User Manual
-GpgFrontend provides documentations on its main features. If you want to know
-how to install, please read the [User
-Manual](https://www.gpgfrontend.bktus.com/overview/glance) instead of README.
+For detailed instructions on installation, usage, and troubleshooting, please
+refer to the official [User
+Manual](https://www.gpgfrontend.bktus.com/overview/glance). The User Manual is
+the primary and most up-to-date resource for all users. It provides
+comprehensive guidance beyond what is found in the README, ensuring you have the
+latest information and best practices.
-The code for the user manual is maintained in [this
-repository](https://github.com/saturneric/GpgFrontend-Manual.git).
+The source code for the user manual is maintained in this
+[repository](https://github.com/saturneric/GpgFrontend-Manual.git).
-## Developer Document
+## Developer Wiki
-You can view the developer documentations that is synchronized with the current
-latest develop code. [Developer Document](https://doxygen.gpgfrontend.bktus.com)
-will help you understand the source code and get involved more quickly in the
-process of contributing to open source.
+[An AI-assisted Wiki](https://deepwiki.com/saturneric/GpgFrontend) has been
+generated through automated analysis of the GpgFrontend source code. This Wiki
+offers a comprehensive overview of the project’s technical architecture, design
+principles, and major components. The information provided is highly accurate,
+making it an excellent resource for both new and experienced contributors.
-The code for the developer documentations is maintained in [this
-repository](https://github.com/saturneric/GpgFrontend-Doxygen.git).
+I strongly recommend reading the Wiki carefully before exploring the source
+code in depth.
## Language Support
diff --git a/resource/appstream/com.bktus.gpgfrontend.appdata.xml b/resource/appstream/com.bktus.gpgfrontend.appdata.xml
index 3f818608..8ea04ace 100644
--- a/resource/appstream/com.bktus.gpgfrontend.appdata.xml
+++ b/resource/appstream/com.bktus.gpgfrontend.appdata.xml
@@ -52,24 +52,32 @@
<screenshots>
<screenshot type="default">
- <image>https://image.cdn.bktus.com/i/2024/02/14/056f1017-331f-ef69-93a6-c49f1d233f8d.png</image>
- <caption>Main Window</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/1d53089c71f47c9c039bdb070d1526feb7ab6792.png</image>
+ <caption>Default Workspace</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/8b891c88-2335-63d8-4f78-2d0dffea763c.png</image>
- <caption>Subkey Management</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/4d59e0a14bbac37f2d7c7ffc3a0cdb4439df4c26.png</image>
+ <caption>Verify Signature of File</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/b1590e858f7480578b9584d3d9ecafddc54772e6.png</image>
+ <caption>Verify Signature of Email</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/704717c6-e2bc-c5f3-e69e-dcc9a588dde4.png</image>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/ae4de317dd6ae3d799dc6544c77ffc1e8550926d.png</image>
+ <caption>Encrypt Text</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/94c2c33b11c612d502ab226c0aa89c96809f98d5.png</image>
<caption>Key Generation</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/d8e79f1c-7d07-c550-b1d7-36c33a901056.png</image>
- <caption>Verify Signature of File</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/438adc94e18d9bdf66c2e92272e0c1c36e6bdb48.png</image>
+ <caption>Key Information</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/f1ef687a-a232-23e3-776d-c03e88c62dca.png</image>
- <caption>Import Key(s) From Key Server</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/72cbd33f559d53f5591eb2690e1dd998f35752b4.png</image>
+ <caption>Key Structure</caption>
</screenshot>
</screenshots>
diff --git a/resource/appstream/com.bktus.gpgfrontend.metainfo.xml b/resource/appstream/com.bktus.gpgfrontend.metainfo.xml
index d3cd58b2..eb9c00a3 100644
--- a/resource/appstream/com.bktus.gpgfrontend.metainfo.xml
+++ b/resource/appstream/com.bktus.gpgfrontend.metainfo.xml
@@ -48,24 +48,32 @@
<screenshots>
<screenshot type="default">
- <image>https://image.cdn.bktus.com/i/2024/02/14/056f1017-331f-ef69-93a6-c49f1d233f8d.png</image>
- <caption>Main Window</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/1d53089c71f47c9c039bdb070d1526feb7ab6792.png</image>
+ <caption>Default Workspace</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/8b891c88-2335-63d8-4f78-2d0dffea763c.png</image>
- <caption>Subkey Management</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/4d59e0a14bbac37f2d7c7ffc3a0cdb4439df4c26.png</image>
+ <caption>Verify Signature of File</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/b1590e858f7480578b9584d3d9ecafddc54772e6.png</image>
+ <caption>Verify Signature of Email</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/704717c6-e2bc-c5f3-e69e-dcc9a588dde4.png</image>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/ae4de317dd6ae3d799dc6544c77ffc1e8550926d.png</image>
+ <caption>Encrypt Text</caption>
+ </screenshot>
+ <screenshot>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/94c2c33b11c612d502ab226c0aa89c96809f98d5.png</image>
<caption>Key Generation</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/d8e79f1c-7d07-c550-b1d7-36c33a901056.png</image>
- <caption>Verify Signature of File</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/438adc94e18d9bdf66c2e92272e0c1c36e6bdb48.png</image>
+ <caption>Key Information</caption>
</screenshot>
<screenshot>
- <image>https://image.cdn.bktus.com/i/2024/02/14/f1ef687a-a232-23e3-776d-c03e88c62dca.png</image>
- <caption>Import Key(s) From Key Server</caption>
+ <image>https://image.cdn.bktus.com/i/2025/06/25/72cbd33f559d53f5591eb2690e1dd998f35752b4.png</image>
+ <caption>Key Structure</caption>
</screenshot>
</screenshots>
diff --git a/src/core/thread/Task.cpp b/src/core/thread/Task.cpp
index f34a38b9..a8fb3d62 100644
--- a/src/core/thread/Task.cpp
+++ b/src/core/thread/Task.cpp
@@ -192,7 +192,7 @@ Task::~Task() = default;
*
* @return QString
*/
-QString Task::GetFullID() const { return p_->GetFullID(); }
+auto Task::GetFullID() const -> QString { return p_->GetFullID(); }
QString Task::GetUUID() const { return p_->GetUUID(); }
diff --git a/src/core/thread/TaskRunner.cpp b/src/core/thread/TaskRunner.cpp
index c7d92382..8caf2e2a 100644
--- a/src/core/thread/TaskRunner.cpp
+++ b/src/core/thread/TaskRunner.cpp
@@ -48,20 +48,23 @@ class TaskRunner::Impl : public QThread {
task->SafelyRun();
}
- auto RegisterTask(const QString& name, const Task::TaskRunnable& runnerable,
- const Task::TaskCallback& cb,
- DataObjectPtr params) -> Task::TaskHandler {
- auto* raw_task = new Task(runnerable, name, std::move(params), cb);
+ auto RegisterTask(const QString& name, const Task::TaskRunnable& runnable,
+ const Task::TaskCallback& cb, DataObjectPtr params)
+ -> Task::TaskHandler {
+ auto* raw_task = new Task(runnable, name, std::move(params), cb);
raw_task->setParent(nullptr);
raw_task->moveToThread(this);
- connect(raw_task, &Task::SignalRun, this, [this, raw_task]() {
- pending_tasks_[raw_task->GetFullID()] = raw_task;
- });
+ const auto full_id = raw_task->GetFullID();
- connect(raw_task, &Task::SignalTaskEnd, this, [this, raw_task]() {
- pending_tasks_.remove(raw_task->GetFullID());
- });
+ connect(raw_task, &Task::SignalRun, this,
+ [this, task = QPointer<Task>(raw_task), full_id]() {
+ if (task == nullptr) return;
+ pending_tasks_[full_id] = task;
+ });
+
+ connect(raw_task, &Task::SignalTaskEnd, this,
+ [this, full_id]() { pending_tasks_.remove(full_id); });
return Task::TaskHandler(raw_task);
}
@@ -136,8 +139,8 @@ auto TaskRunner::IsRunning() -> bool { return p_->isRunning(); }
auto TaskRunner::RegisterTask(const QString& name,
const Task::TaskRunnable& runnable,
- const Task::TaskCallback& cb,
- DataObjectPtr p_pbj) -> Task::TaskHandler {
+ const Task::TaskCallback& cb, DataObjectPtr p_pbj)
+ -> Task::TaskHandler {
return p_->RegisterTask(name, runnable, cb, p_pbj);
}
} // namespace GpgFrontend::Thread