ltk/input/keyboard/
back.rsuse crate::app::{ App, BackAtRoot, BackResponse };
use crate::event_loop::{ AppData, SurfaceFocus };
use crate::platform::Platform;
use crate::Keysym;
impl<A: App, P: Platform> AppData<A, P>
{
pub( crate ) fn dismiss_transient( &mut self, focus: SurfaceFocus ) -> bool
{
if !self.overlays.is_empty() && self.app.overlays().iter().any( | s | s.anchor_widget_id.is_some() )
{
self.dismiss_all_popups();
return true;
}
if self.surface( focus ).context_menu.is_some()
{
self.hide_context_menu( focus );
return true;
}
if self.collapse_selection_if_any( focus ) { return true; }
let escape_msg = self.surface( focus ).frame.widget_rects.iter()
.rev()
.find_map( |w| w.handlers.escape_msg() );
if let Some( msg ) = escape_msg
{
self.pending_msgs.push( msg );
return true;
}
false
}
pub( crate ) fn handle_back( &mut self, focus: SurfaceFocus )
{
if self.dismiss_transient( focus ) { return; }
if self.focused_text_input( focus )
{
self.set_focus( focus, None );
return;
}
self.back_into_app();
}
fn back_into_app( &mut self )
{
match self.app.on_back()
{
BackResponse::Message( msg ) => self.pending_msgs.push( msg ),
BackResponse::Consumed => {}
BackResponse::Unhandled =>
{
let legacy = self.app.on_key_with_modifiers( Keysym::XF86_Back, self.ctrl_pressed, self.shift_pressed );
match legacy
{
Some( msg ) => self.pending_msgs.push( msg ),
None => self.back_at_root(),
}
}
}
}
fn back_at_root( &mut self )
{
if !self.platform.back_leaves( &self.main.platform ) { return; }
match self.app.back_at_root()
{
BackAtRoot::Minimize => self.platform.minimize_window( &self.main.platform ),
BackAtRoot::Close =>
{
self.request_close();
}
BackAtRoot::Ignore => {}
}
}
}