diff --git a/src/app.rs b/src/app.rs index 1d2361b9..2523a5be 100644 --- a/src/app.rs +++ b/src/app.rs @@ -150,10 +150,6 @@ impl App { ), ["i"], ), - ( - format!("{}.{}", browser.action.id, browser.action.escape.name()), - ["Escape"], - ), // Tab actions ( format!( diff --git a/src/app/browser.rs b/src/app/browser.rs index fa22eb90..0103bfea 100644 --- a/src/app/browser.rs +++ b/src/app/browser.rs @@ -76,15 +76,6 @@ impl Browser { } }); - action.escape.connect_activate({ - let widget = widget.clone(); - let window = window.clone(); - move |_, _| { - window.escape(); - widget.application_window.set_focus(gtk::Window::NONE); - } - }); - action.profile.connect_activate({ let profile = profile.clone(); move || { diff --git a/src/app/browser/action.rs b/src/app/browser/action.rs index a26e047d..74cd2430 100644 --- a/src/app/browser/action.rs +++ b/src/app/browser/action.rs @@ -1,17 +1,15 @@ mod about; mod close; mod debug; -mod escape; mod profile; use about::About; use close::Close; use debug::Debug; -use escape::Escape; use profile::Profile; use gtk::{ - gio::{SimpleAction, SimpleActionGroup}, + gio::SimpleActionGroup, glib::{GString, uuid_string_random}, prelude::ActionMapExt, }; @@ -23,7 +21,6 @@ pub struct Action { pub about: Rc, pub close: Rc, pub debug: Rc, - pub escape: SimpleAction, pub profile: Rc, // Group pub id: GString, @@ -45,7 +42,6 @@ impl Action { let about = Rc::new(About::new()); let close = Rc::new(Close::new()); let debug = Rc::new(Debug::new()); - let escape = SimpleAction::escape(); let profile = Rc::new(Profile::new()); // Generate unique group ID @@ -58,7 +54,6 @@ impl Action { simple_action_group.add_action(&about.simple_action); simple_action_group.add_action(&close.simple_action); simple_action_group.add_action(&debug.simple_action); - simple_action_group.add_action(&escape); simple_action_group.add_action(&profile.simple_action); // Done @@ -66,7 +61,6 @@ impl Action { about, close, debug, - escape, profile, id, simple_action_group, diff --git a/src/app/browser/action/escape.rs b/src/app/browser/action/escape.rs deleted file mode 100644 index 48e32ad6..00000000 --- a/src/app/browser/action/escape.rs +++ /dev/null @@ -1,12 +0,0 @@ -use gtk::{gio::SimpleAction, glib::uuid_string_random}; - -/// [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html) wrapper for `Escape` action of `Browser` group -pub trait Escape { - fn escape() -> Self; -} - -impl Escape for SimpleAction { - fn escape() -> Self { - SimpleAction::new(&uuid_string_random(), None) - } -} diff --git a/src/app/browser/window.rs b/src/app/browser/window.rs index fa5f306f..5f6f7bca 100644 --- a/src/app/browser/window.rs +++ b/src/app/browser/window.rs @@ -29,7 +29,7 @@ impl Window { let action = Rc::new(Action::new()); // Init components - let tab = Rc::new(Tab::build(profile, (browser_action, &action))); + let tab = Rc::new(Tab::build(profile, &action)); // Init events action.append.connect_activate({ @@ -131,9 +131,6 @@ impl Window { } // Actions - pub fn escape(&self) { - self.tab.escape(); - } pub fn clean(&self, transaction: &Transaction, app_browser_id: i64) -> Result<()> { for record in database::select(transaction, app_browser_id)? { diff --git a/src/app/browser/window/tab.rs b/src/app/browser/window/tab.rs index 400fe9d3..424ed504 100644 --- a/src/app/browser/window/tab.rs +++ b/src/app/browser/window/tab.rs @@ -3,7 +3,7 @@ mod database; mod item; mod menu; -use super::{Action as WindowAction, BrowserAction, Position}; +use super::{Action as WindowAction, Position}; use crate::Profile; use action::Action; use adw::{TabPage, TabView}; @@ -17,7 +17,6 @@ use std::{cell::RefCell, collections::HashMap, rc::Rc, sync::Arc}; // Main pub struct Tab { - browser_action: Rc, window_action: Rc, profile: Arc, index: Rc>>>, @@ -29,10 +28,7 @@ impl Tab { // Constructors /// Build new `Self` - pub fn build( - profile: &Arc, - (browser_action, window_action): (&Rc, &Rc), - ) -> Self { + pub fn build(profile: &Arc, window_action: &Rc) -> Self { let action = Rc::new(Action::new()); // Init empty HashMap index @@ -126,7 +122,6 @@ impl Tab { // Return activated `Self` Self { profile: profile.clone(), - browser_action: browser_action.clone(), window_action: window_action.clone(), index, tab_view, @@ -152,7 +147,7 @@ impl Tab { (&tab_page, &target_child), &self.profile, // Actions - (&self.browser_action, &self.window_action, &self.action), + (&self.window_action, &self.action), // Options request, is_load, @@ -216,13 +211,6 @@ impl Tab { } } - // Toggle escape action for specified or current item - pub fn escape(&self) { - if let Some(item) = self.item(None) { - item.page.escape(); - } - } - // Toggle search widget pub fn find(&self, page_position: Option) { if let Some(item) = self.item(page_position) { @@ -317,7 +305,7 @@ impl Tab { (&tab_page, &target_child), &self.profile, // Actions - (&self.browser_action, &self.window_action, &self.action), + (&self.window_action, &self.action), // Options None, false, diff --git a/src/app/browser/window/tab/item.rs b/src/app/browser/window/tab/item.rs index 71b90d74..196194ca 100644 --- a/src/app/browser/window/tab/item.rs +++ b/src/app/browser/window/tab/item.rs @@ -3,7 +3,7 @@ mod client; mod database; mod page; -use super::{Action as TabAction, BrowserAction, WindowAction}; +use super::{Action as TabAction, WindowAction}; use crate::Profile; use action::Action; use adw::TabPage; @@ -33,11 +33,7 @@ impl Item { pub fn build( (tab_page, target_child): (&TabPage, &Box), profile: &Arc, - (browser_action, window_action, tab_action): ( - &Rc, - &Rc, - &Rc, - ), + (window_action, tab_action): (&Rc, &Rc), request: Option<&str>, is_load: bool, ) -> Self { @@ -59,7 +55,7 @@ impl Item { // Create new `Page` implementation for `TabPage` let page = Rc::new(Page::build( profile, - (browser_action, window_action, tab_action, &action), + (window_action, tab_action, &action), tab_page, )); diff --git a/src/app/browser/window/tab/item/client.rs b/src/app/browser/window/tab/item/client.rs index abde4d76..9a62fab5 100644 --- a/src/app/browser/window/tab/item/client.rs +++ b/src/app/browser/window/tab/item/client.rs @@ -7,7 +7,7 @@ use feature::Feature; use gtk::{ gio::Cancellable, glib::{Uri, UriFlags}, - prelude::{ActionExt, CancellableExt}, + prelude::CancellableExt, }; use std::{cell::Cell, rc::Rc, sync::Arc}; @@ -37,12 +37,11 @@ impl Client { /// Route tab item `request` to protocol driver /// * or `navigation` entry if the value not provided pub fn handle(&self, request: &str, is_snap_history: bool) { + self.page.escape(); + // Deprecate page info but keep it data as is self.page.info.borrow_mut().deprecate(); - // Move focus out from navigation entry @TODO - self.page.browser_action.escape.activate(None); - // Initially disable find action self.page .window_action diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 2277dc55..2840c428 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -5,10 +5,11 @@ mod input; mod navigation; mod search; -use super::{Action as ItemAction, BrowserAction, Profile, TabAction, WindowAction}; +use super::{Action as ItemAction, Profile, TabAction, WindowAction}; use adw::TabPage; use anyhow::Result; use content::Content; +use gtk::prelude::WidgetExt; use info::Info; use input::Input; use navigation::Navigation; @@ -19,7 +20,6 @@ use std::{cell::RefCell, rc::Rc, sync::Arc}; pub struct Page { pub profile: Arc, // Actions - pub browser_action: Rc, pub item_action: Rc, pub window_action: Rc, // Components @@ -42,8 +42,7 @@ impl Page { pub fn build( profile: &Arc, - (browser_action, window_action, tab_action, item_action): ( - &Rc, + (window_action, tab_action, item_action): ( &Rc, &Rc, &Rc, @@ -65,7 +64,6 @@ impl Page { profile: profile.clone(), tab_page: tab_page.clone(), // Actions - browser_action: browser_action.clone(), item_action: item_action.clone(), window_action: window_action.clone(), // Components @@ -86,8 +84,14 @@ impl Page { /// Request `Escape` action for all page components pub fn escape(&self) { + use gtk::prelude::RootExt; self.search.hide(); self.navigation.escape(); + self.content + .g_box + .root() + .unwrap() + .set_focus(gtk::Window::NONE); } /// Toggle `Find` widget diff --git a/src/app/browser/window/tab/item/page/search.rs b/src/app/browser/window/tab/item/page/search.rs index c3607f4e..938ece8b 100644 --- a/src/app/browser/window/tab/item/page/search.rs +++ b/src/app/browser/window/tab/item/page/search.rs @@ -49,6 +49,22 @@ impl Search { g_box.append(&placeholder.label); g_box.append(&close); + // Hide widget on `Escape` key pressed + g_box.add_controller({ + use gtk::{gdk::Key, glib::Propagation}; + let c = gtk::EventControllerKey::new(); + c.connect_key_pressed({ + let g_box = g_box.clone(); + move |_, k, _, _| { + if k == Key::Escape { + g_box.set_visible(false) + } + Propagation::Stop + } + }); + c + }); + // Connect events close.connect_clicked({ let form = form.clone();