-- Leo's gemini proxy

-- Connecting to typed-hole.org:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

commit 6be7b5bd4053ad96034b1a2e4d1615358e5d5643

Author: Julien Blanchard <julien@sideburns.eu>

Date: Mon Dec 23 17:06:06 2019 +0100


Handle input response


diff --git a/src/gui.rs b/src/gui.rs

index 4685127..bbda792 100644

--- a/src/gui.rs

+++ b/src/gui.rs

@@ -52,6 +52,10 @@ impl Gui {

// self.result.set_text(&format!("{}", state.value));

// }


+ pub fn window(&self) -> &ApplicationWindow {

+ &self.window

+ }

+

pub fn url_bar(&self) -> &Entry {

&self.url_bar

}

diff --git a/src/main.rs b/src/main.rs

index 7a012ee..1b51095 100644

--- a/src/main.rs

+++ b/src/main.rs

@@ -9,9 +9,9 @@ use std::sync::Arc;


use glib::clone;

use gtk::prelude::*;

-use gtk::TextBuffer;

+use gtk::{ResponseType, TextBuffer};


-use url::Url;

+use url::{Position, Url};


mod gui;

use gui::Gui;

@@ -45,17 +45,17 @@ fn main() {


// Bind URL bar

{

- let gui2 = gui.clone();

+ let gui_clone = gui.clone();

let url_bar = gui.url_bar();

- url_bar.connect_activate(move |bar| {

- let url = bar.get_text().expect("get_text failed").to_string();

+ url_bar.connect_activate(move |b| {

+ let url = b.get_text().expect("get_text failed").to_string();

let full_url = if url.starts_with("gemini://") {

url

} else {

format!("gemini://{}", url)

};


- visit_url(&gui2, full_url);

+ visit_url(&gui_clone, full_url);

});

}


@@ -73,7 +73,7 @@ fn go_back(gui: &Arc<Gui>) {

}

}


-fn update_url_field(gui: &Arc<Gui>, url: &str) -> () {

+fn update_url_field(gui: &Arc<Gui>, url: &str) {

let url_bar = gui.url_bar();

url_bar.get_buffer().set_text(url);

}

@@ -107,14 +107,9 @@ fn visit_url(gui: &Arc<Gui>, url: String) {

}

}

Status::Gone(_meta) => {

- clear_buffer(&content_view);

-

- let buffer = content_view.get_buffer().unwrap();

- let mut end_iter = buffer.get_end_iter();

-

- buffer.insert_markup(

- &mut end_iter,

- "<span foreground=\"red\" size=\"x-large\">Sorry page is gone.</span>\n",

+ error_dialog(

+ &gui,

+ "\nSorry page is gone.\n",

);

}

Status::RedirectTemporary(new_url)

@@ -123,37 +118,24 @@ fn visit_url(gui: &Arc<Gui>, url: String) {

}

Status::TransientCertificateRequired(_meta)

| Status::AuthorisedCertificatedRequired(_meta) => {

- clear_buffer(&content_view);

-

- let buffer = content_view.get_buffer().unwrap();

- let mut end_iter = buffer.get_end_iter();

-

- buffer.insert_markup(

- &mut end_iter,

- "<span foreground=\"red\" size=\"x-large\">You need a valid certificate to access this page.</span>\n",

+ error_dialog(

+ &gui,

+ "\nYou need a valid certificate to access this page.\n",

);

}

- // Status::Input(message) => {

- // prompt_for_answer(s, url_copy, message);

- // }

+ Status::Input(message) => {

+ input_dialog(&gui, url, &message);

+ }

_ => (),

}

}

}

Err(_) => {

- let buffer = content_view.get_buffer().unwrap();

- let mut end_iter = buffer.get_end_iter();

-

- clear_buffer(&content_view);

-

- buffer.insert_markup(

- &mut end_iter,

- "<span foreground=\"red\" size=\"x-large\">ERROR</span>\n",

- );

+ error_dialog(&gui, "\nInvalid URL.\n");

}

},

Err(_) => {

- println!("Could not parse {}", url.as_str());

+ error_dialog(&gui, "\nInvalid URL.\n");

}

}

}

@@ -240,7 +222,7 @@ fn draw_link(gui: &Arc<Gui>, link_item: String) {

insert_gemini_button(&gui, url, label);

}

Ok(Link::Relative(url, label)) => {

- let new_url = absolute::make(&url.clone().to_string()).unwrap();

+ let new_url = absolute::make(&url).unwrap();

insert_gemini_button(&gui, new_url, label);

}

Ok(Link::Unknown(_, _)) => (),

@@ -290,12 +272,50 @@ fn insert_external_button(gui: &Arc<Gui>, url: Url, label: &str) {

buffer.insert(&mut end_iter, "\n");

}


+fn error_dialog(gui: &Arc<Gui>, message: &str) {

+ let dialog = gtk::Dialog::new_with_buttons(

+ Some("Error"),

+ Some(gui.window()),

+ gtk::DialogFlags::MODAL,

+ &[("Close", ResponseType::Close)],

+ );

+ dialog.set_default_response(ResponseType::Close);

+ dialog.connect_response(|dialog, _| dialog.destroy());

+

+ let content_area = dialog.get_content_area();

+ let message = gtk::Label::new(Some(message));

+ content_area.add(&message);

+

+ dialog.show_all();

+}

+

+fn input_dialog(gui: &Arc<Gui>, url: Url, message: &str) {

+ let dialog = gtk::Dialog::new_with_buttons(

+ Some(message),

+ Some(gui.window()),

+ gtk::DialogFlags::MODAL,

+ &[("Close", ResponseType::Close),("Send", ResponseType::Accept)],

+ );

+

+ let content_area = dialog.get_content_area();

+ let entry = gtk::Entry::new();

+ content_area.add(&entry);

+

+ dialog.show_all();

+

+ if dialog.run() == gtk::ResponseType::Accept {

+ let response = entry.get_text().expect("get_text failed").to_string();

+ let cleaned: &str = &url[..Position::AfterPath];

+ let full_url = format!("{}?{}", cleaned.to_string(), response);

+ visit_url(&gui, full_url);

+ }

+

+ dialog.destroy();

+}

+

fn clear_buffer(view: &gtk::TextView) {

- match view.get_buffer() {

- Some(buffer) => {

- let (mut start, mut end) = buffer.get_bounds();

- buffer.delete(&mut start, &mut end);

- }

- None => (),

+ if let Some(buffer) = view.get_buffer() {

+ let (mut start, mut end) = buffer.get_bounds();

+ buffer.delete(&mut start, &mut end);

}

}

diff --git a/src/tags.rs b/src/tags.rs

index cb30d87..1eaa7a4 100644

--- a/src/tags.rs

+++ b/src/tags.rs

@@ -68,8 +68,7 @@ fn heading_tag(level: i32) -> gtk::TextTag {

}


fn text_tag() -> gtk::TextTag {

- let tag = gtk::TextTag::new(Some("text"));

- tag

+ gtk::TextTag::new(Some("text"))

}


fn bold_tag() -> gtk::TextTag {

@@ -79,28 +78,23 @@ fn bold_tag() -> gtk::TextTag {

}


fn list_tag() -> gtk::TextTag {

- let tag = gtk::TextTag::new(Some("li"));

- tag

+ gtk::TextTag::new(Some("li"))

}


fn del_tag() -> gtk::TextTag {

- let tag = gtk::TextTag::new(Some("del"));

- tag

+ gtk::TextTag::new(Some("del"))

}


fn ref_tag() -> gtk::TextTag {

- let tag = gtk::TextTag::new(Some("ref"));

- tag

+ gtk::TextTag::new(Some("ref"))

}


fn references_tag() -> gtk::TextTag {

- let tag = gtk::TextTag::new(Some("references"));

- tag

+ gtk::TextTag::new(Some("references"))

}


fn sub_tag() -> gtk::TextTag {

- let tag = gtk::TextTag::new(Some("sub"));

- tag

+ gtk::TextTag::new(Some("sub"))

}


fn italic_tag() -> gtk::TextTag {



---

Served by Pollux Gemini Server.

-- Response ended

-- Page fetched on Mon May 27 18:20:39 2024