diff --git a/Cargo.toml b/Cargo.toml index 360f9d55..aae43221 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,10 @@ version = "5.2.0" [dependencies.ansi-parser] version = "0.9.1" +[dependencies.sourceview] +package = "sourceview5" +version = "0.9.1" + # development [patch.crates-io] # ggemini = { path = "ggemini" } diff --git a/README.md b/README.md index a2e003e9..1a6b3adf 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ GTK 4 / Libadwaita client written in Rust * [ ] `file://` - localhost browser * [ ] System * [ ] `config:` - low-level key/value settings editor - * [x] `view-source:` - page source viewer (where supported) + * [x] `source:` - page source viewer (where supported) ### Media types @@ -129,13 +129,14 @@ GTK 4 / Libadwaita client written in Rust * GDK PixBuf `2.42` * Glib `2.80` * GTK `4.14` +* GtkSourceView `5.14` * Libadwaita `1.5` (Ubuntu 24.04+) #### Debian ``` bash sudo apt install git curl build-essential\ - libgtk-4-dev libadwaita-1-dev\ + libgtk-4-dev libgtksourceview-5-dev libadwaita-1-dev\ libsqlite3-dev libssl-dev ``` @@ -143,7 +144,7 @@ sudo apt install git curl build-essential\ ``` bash sudo dnf install git curl gcc\ - gtk4-devel libadwaita-devel\ + gtk4-devel gtksourceview5-devel libadwaita-devel\ sqlite-devel openssl-devel ``` diff --git a/src/app/browser/about.rs b/src/app/browser/about.rs index 631c8761..370c1fe4 100644 --- a/src/app/browser/about.rs +++ b/src/app/browser/about.rs @@ -11,11 +11,17 @@ impl About { // Collect debug info let debug = &[ format!( - "GTK {}.{}.{}", + "Gtk {}.{}.{}", gtk::major_version(), gtk::minor_version(), gtk::micro_version() ), + format!( + "GtkSourceView {}.{}.{}", + sourceview::major_version(), + sourceview::minor_version(), + sourceview::micro_version() + ), format!("SQLite {}", sqlite::version()), // @TODO ]; diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 2f495667..95ca7655 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -198,8 +198,8 @@ impl Page { }; // Detect source view mode, return `request` string prepared for route - let (request, is_view_source) = match request.strip_prefix("view-source:") { - Some(postfix) => (gformat!("{}", postfix.to_string()), true), + let (request, is_view_source) = match request.strip_prefix("source:") { + Some(postfix) => (GString::from(postfix), true), None => (request, false), }; diff --git a/src/app/browser/window/tab/item/page/content/text/source.rs b/src/app/browser/window/tab/item/page/content/text/source.rs index 44e0694d..bb8e3235 100644 --- a/src/app/browser/window/tab/item/page/content/text/source.rs +++ b/src/app/browser/window/tab/item/page/content/text/source.rs @@ -1,22 +1,29 @@ -use gtk::{TextBuffer, TextView}; - +use sourceview::{Buffer, StyleScheme, View}; const MARGIN: i32 = 8; pub struct Source { - pub text_view: TextView, + pub text_view: View, } impl Source { pub fn new(data: &str) -> Self { Self { - text_view: TextView::builder() + text_view: View::builder() .bottom_margin(MARGIN) - .buffer(&TextBuffer::builder().text(data).build()) + .buffer( + &Buffer::builder() + .text(data) + .style_scheme(&StyleScheme::builder().build()) // adaptive + .highlight_syntax(true) + .build(), + ) .cursor_visible(false) .editable(false) .left_margin(MARGIN) .monospace(true) .right_margin(MARGIN) + .show_line_marks(true) + .show_line_numbers(true) .top_margin(MARGIN) .vexpand(true) .build(),