From e1ee9c14eee82504541a7d56ebdc8b8266e48513 Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Sat, 8 Jul 2023 22:33:44 +0200 Subject: [PATCH] about: Add basic debug information --- po/POTFILES.in | 1 + src/about.rs | 71 ++++++++++++++++++++++++++++++++++++++++++++++ src/application.rs | 30 +++++--------------- src/main.rs | 1 + 4 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 src/about.rs 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;