diff --git a/po/POTFILES.in b/po/POTFILES.in
index f266ae9..82000d2 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -6,6 +6,7 @@ data/gtk/window.ui
data/org.gnome.Loupe.desktop.in.in
data/org.gnome.Loupe.metainfo.xml.in.in
data/resources/gtk/help-overlay.ui
+src/about.rs
src/application.rs
src/decoder/formats/glycin_proxy.rs
src/decoder/formats/mod.rs
diff --git a/src/about.rs b/src/about.rs
new file mode 100644
index 0000000..12ac4af
--- /dev/null
+++ b/src/about.rs
@@ -0,0 +1,71 @@
+// Copyright (c) 2023 Sophie Herold
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+use gettextrs::gettext;
+
+use crate::config;
+
+pub async fn window() -> adw::AboutWindow {
+ // Builders are a pattern that allow you to create
+ // an object and set all relevant properties very
+ // easily in a way that's idiomatic to Rust.
+ adw::AboutWindow::builder()
+ .application_name(gettext("Loupe"))
+ .application_icon(config::APP_ID)
+ .version(config::VERSION)
+ .developer_name(gettext("The Loupe Team"))
+ .website("https://gitlab.gnome.org/GNOME/Incubator/loupe")
+ .issue_url("https://gitlab.gnome.org/GNOME/Incubator/loupe/-/issues/new")
+ .developers([
+ "Christopher Davis ",
+ "Sophie Herold ",
+ ])
+ .designers(["Allan Day", "Jakub Steiner", "Tobias Bernard"])
+ // Translators: Replace "translator-credits" with your names, one name per line
+ .translator_credits(gettext("translator-credits"))
+ .copyright(gettext("Copyright © 2020–2023 Christopher Davis et al."))
+ .license_type(gtk::License::Gpl30)
+ .debug_info(debug_info().await)
+ .build()
+}
+
+async fn etc() -> std::path::PathBuf {
+ if ashpd::is_sandboxed().await {
+ std::path::PathBuf::from("/run/host/etc")
+ } else {
+ std::path::PathBuf::from("/etc")
+ }
+}
+
+async fn os_release() -> String {
+ let os_release = etc().await.join("os-release");
+ std::fs::read_to_string(os_release).unwrap_or_default()
+}
+
+async fn debug_info() -> String {
+ [
+ format!("- Version: {}", config::VERSION),
+ format!("- App ID: {}", config::APP_ID),
+ format!(
+ "- Sandboxed: {} {}",
+ ashpd::is_sandboxed().await,
+ std::env::var("container").unwrap_or_default()
+ ),
+ format!("\n##### OS Information\n```\n{}\n```", os_release().await),
+ ]
+ .join("\n")
+}
diff --git a/src/application.rs b/src/application.rs
index 131d58d..7606c7a 100644
--- a/src/application.rs
+++ b/src/application.rs
@@ -18,8 +18,8 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
+use crate::about;
use crate::deps::*;
-use crate::util::gettext::*;
use crate::util::spawn;
use adw::prelude::*;
@@ -112,7 +112,10 @@ impl LpApplication {
// add them with add_action_entries().
let actions = [
gio::ActionEntryBuilder::new("about")
- .activate(|app: &Self, _, _| app.show_about())
+ .activate(|app: &Self, _, _| {
+ let app = app.clone();
+ spawn(async move { app.show_about().await });
+ })
.build(),
gio::ActionEntryBuilder::new("help")
.activate(|app: &Self, _, _| app.show_help())
@@ -185,27 +188,8 @@ impl LpApplication {
self.set_accels_for_action("window.close", &["W"]);
}
- pub fn show_about(&self) {
- // Builders are a pattern that allow you to create
- // an object and set all relevant properties very
- // easily in a way that's idiomatic to Rust.
- let about = adw::AboutWindow::builder()
- .application_name(gettext("Loupe"))
- .application_icon(config::APP_ID)
- .version(config::VERSION)
- .developer_name(gettext("The Loupe Team"))
- .website("https://gitlab.gnome.org/GNOME/Incubator/loupe")
- .issue_url("https://gitlab.gnome.org/GNOME/Incubator/loupe/-/issues/new")
- .developers([
- "Christopher Davis ",
- "Sophie Herold ",
- ])
- .designers(["Allan Day", "Jakub Steiner", "Tobias Bernard"])
- // Translators: Replace "translator-credits" with your names, one name per line
- .translator_credits(gettext("translator-credits"))
- .copyright(gettext("Copyright © 2020–2023 Christopher Davis et al."))
- .license_type(gtk::License::Gpl30)
- .build();
+ pub async fn show_about(&self) {
+ let about = about::window().await;
if let Some(window) = self.active_window() {
about.set_transient_for(Some(&window));
diff --git a/src/main.rs b/src/main.rs
index ba46d54..41196c2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -48,6 +48,7 @@ Simplified widget arrangement including the most important widgets.
use gettextrs::*;
use gtk::gio::{self, prelude::*};
+mod about;
mod application;
mod config;
mod decoder;