diff --git a/src/gliumwindows.rs b/src/gliumwindows.rs index 66eee08c0..a19559f8b 100644 --- a/src/gliumwindows.rs +++ b/src/gliumwindows.rs @@ -631,36 +631,7 @@ impl GliumTerminalWindow { return Ok(()); } - if mods == KeyModifiers::SUPER && key == KeyCode::Char('t') { - GuiEventLoop::with_window(&self.event_loop, self.window_id(), |win| { - win.spawn_tab().map(|_| ()) - }); - return Ok(()); - } - - if mods == KeyModifiers::ALT - && (key == KeyCode::Char('\r') - || key == KeyCode::Char('\n') - || key == KeyCode::Enter) - { - self.host.toggle_full_screen(); - return Ok(()); - } - - if cfg!(target_os = "macos") - && mods == KeyModifiers::SUPER - && key == KeyCode::Char('c') - { - // Nominally copy, but that is implicit, so NOP - return Ok(()); - } - if (cfg!(target_os = "macos") - && mods == KeyModifiers::SUPER - && key == KeyCode::Char('v')) - || (mods == KeyModifiers::SHIFT && key == KeyCode::Insert) - { - tab.terminal() - .send_paste(&self.host.get_clipboard()?, &mut *tab.pty())?; + if self.host.process_gui_shortcuts(tab, mods, key)? { return Ok(()); } diff --git a/src/guicommon/host.rs b/src/guicommon/host.rs index b108efd0a..6b8966a55 100644 --- a/src/guicommon/host.rs +++ b/src/guicommon/host.rs @@ -1,9 +1,11 @@ use super::window::TerminalWindow; +use crate::guicommon::tabs::Tab; use crate::MasterPty; use clipboard::{ClipboardContext, ClipboardProvider}; use failure::Error; use std::ops::{Deref, DerefMut}; use std::rc::Rc; +use term::{KeyCode, KeyModifiers}; use termwiz::hyperlink::Hyperlink; pub trait HostHelper { @@ -48,6 +50,110 @@ impl HostImpl { // to us again until the second call to get_clipboard. self.get_clipboard().map(|_| ()) } + + pub fn process_gui_shortcuts( + &mut self, + tab: &Tab, + mods: KeyModifiers, + key: KeyCode, + ) -> Result { + if mods == KeyModifiers::SUPER && key == KeyCode::Char('t') { + self.with_window(|win| win.spawn_tab().map(|_| ())); + return Ok(true); + } + + if mods == KeyModifiers::ALT + && (key == KeyCode::Char('\r') || key == KeyCode::Char('\n') || key == KeyCode::Enter) + { + self.toggle_full_screen(); + return Ok(true); + } + + if cfg!(target_os = "macos") && mods == KeyModifiers::SUPER && key == KeyCode::Char('c') { + // Nominally copy, but that is implicit, so NOP + return Ok(true); + } + if (cfg!(target_os = "macos") && mods == KeyModifiers::SUPER && key == KeyCode::Char('v')) + || (mods == KeyModifiers::SHIFT && key == KeyCode::Insert) + { + tab.terminal() + .send_paste(&self.get_clipboard()?, &mut *tab.pty())?; + return Ok(true); + } + if mods == (KeyModifiers::SUPER | KeyModifiers::SHIFT) + && (key == KeyCode::Char('[') || key == KeyCode::Char('{')) + { + self.activate_tab_relative(-1); + return Ok(true); + } + if mods == (KeyModifiers::SUPER | KeyModifiers::SHIFT) + && (key == KeyCode::Char(']') || key == KeyCode::Char('}')) + { + self.activate_tab_relative(1); + return Ok(true); + } + + if (mods == KeyModifiers::SUPER || mods == KeyModifiers::CTRL) && key == KeyCode::Char('-') + { + self.decrease_font_size(); + return Ok(true); + } + if (mods == KeyModifiers::SUPER || mods == KeyModifiers::CTRL) && key == KeyCode::Char('=') + { + self.increase_font_size(); + return Ok(true); + } + if (mods == KeyModifiers::SUPER || mods == KeyModifiers::CTRL) && key == KeyCode::Char('0') + { + self.reset_font_size(); + return Ok(true); + } + + if mods == KeyModifiers::SUPER { + if let KeyCode::Char(c) = key { + if c >= '0' && c <= '9' { + let tab_number = c as u32 - 0x30; + // Treat 0 as 10 as that is physically right of 9 on + // a keyboard + let tab_number = if tab_number == 0 { 10 } else { tab_number - 1 }; + self.activate_tab(tab_number as usize); + return Ok(true); + } + } + } + Ok(false) + } + + pub fn activate_tab(&mut self, tab: usize) { + self.with_window(move |win| win.activate_tab(tab)) + } + + pub fn activate_tab_relative(&mut self, tab: isize) { + self.with_window(move |win| win.activate_tab_relative(tab)) + } + + pub fn increase_font_size(&mut self) { + self.with_window(move |win| { + let scale = win.fonts().get_font_scale(); + let dims = win.get_dimensions(); + win.scaling_changed(Some(scale * 1.1), None, dims.width, dims.height) + }) + } + + pub fn decrease_font_size(&mut self) { + self.with_window(move |win| { + let scale = win.fonts().get_font_scale(); + let dims = win.get_dimensions(); + win.scaling_changed(Some(scale * 0.9), None, dims.width, dims.height) + }) + } + + pub fn reset_font_size(&mut self) { + self.with_window(move |win| { + let dims = win.get_dimensions(); + win.scaling_changed(Some(1.0), None, dims.width, dims.height) + }) + } } impl Deref for HostImpl { @@ -104,34 +210,22 @@ impl<'a, H: HostHelper> term::TerminalHost for TabHost<'a, H> { } fn activate_tab(&mut self, tab: usize) { - self.host.with_window(move |win| win.activate_tab(tab)) + self.host.activate_tab(tab) } fn activate_tab_relative(&mut self, tab: isize) { - self.host - .with_window(move |win| win.activate_tab_relative(tab)) + self.host.activate_tab_relative(tab) } fn increase_font_size(&mut self) { - self.host.with_window(move |win| { - let scale = win.fonts().get_font_scale(); - let dims = win.get_dimensions(); - win.scaling_changed(Some(scale * 1.1), None, dims.width, dims.height) - }) + self.host.increase_font_size() } fn decrease_font_size(&mut self) { - self.host.with_window(move |win| { - let scale = win.fonts().get_font_scale(); - let dims = win.get_dimensions(); - win.scaling_changed(Some(scale * 0.9), None, dims.width, dims.height) - }) + self.host.decrease_font_size() } fn reset_font_size(&mut self) { - self.host.with_window(move |win| { - let dims = win.get_dimensions(); - win.scaling_changed(Some(1.0), None, dims.width, dims.height) - }) + self.host.reset_font_size() } } diff --git a/src/xwindows/xwin.rs b/src/xwindows/xwin.rs index 17bdf9eb8..da5a78b60 100644 --- a/src/xwindows/xwin.rs +++ b/src/xwindows/xwin.rs @@ -236,14 +236,8 @@ impl X11TerminalWindow { ); return Ok(()); } - if mods == KeyModifiers::SUPER && code == KeyCode::Char('t') { - self.host.with_window(|win| win.spawn_tab().map(|_| ())); - return Ok(()); - } - if mods == KeyModifiers::SHIFT && key == KeyCode::Insert { - tab.terminal() - .send_paste(&self.host.get_clipboard()?, &mut *tab.pty())?; + if self.host.process_gui_shortcuts(tab, mods, key)? { return Ok(()); } diff --git a/term/src/terminalstate.rs b/term/src/terminalstate.rs index aea54304d..3505b7e90 100644 --- a/term/src/terminalstate.rs +++ b/term/src/terminalstate.rs @@ -709,60 +709,6 @@ impl TerminalState { // TODO: also respect self.application_keypad - if mods == (KeyModifiers::SUPER | KeyModifiers::SHIFT) - && (key == KeyCode::Char('[') || key == KeyCode::Char('{')) - { - host.activate_tab_relative(-1); - return Ok(()); - } - if mods == (KeyModifiers::SUPER | KeyModifiers::SHIFT) - && (key == KeyCode::Char(']') || key == KeyCode::Char('}')) - { - host.activate_tab_relative(1); - return Ok(()); - } - - if (mods == KeyModifiers::SUPER || mods == KeyModifiers::CTRL) && key == KeyCode::Char('-') - { - host.decrease_font_size(); - return Ok(()); - } - if (mods == KeyModifiers::SUPER || mods == KeyModifiers::CTRL) && key == KeyCode::Char('=') - { - host.increase_font_size(); - return Ok(()); - } - if (mods == KeyModifiers::SUPER || mods == KeyModifiers::CTRL) && key == KeyCode::Char('0') - { - host.reset_font_size(); - return Ok(()); - } - - if mods == KeyModifiers::SUPER { - if let Char(c) = key { - if c >= '0' && c <= '9' { - let tab_number = c as u32 - 0x30; - // Treat 0 as 10 as that is physically right of 9 on - // a keyboard - let tab_number = if tab_number == 0 { 10 } else { tab_number - 1 }; - host.activate_tab(tab_number as usize); - return Ok(()); - } - } - } - - macro_rules! paste { - () => {{ - let clip = host.get_clipboard()?; - if self.bracketed_paste { - write!(buf, "\x1b[200~{}\x1b[201~", clip)?; - } else { - buf = clip; - } - buf.as_str() - }}; - } - let to_send = match (key, ctrl, alt, shift, self.application_cursor_keys) { (Enter, _, ALT, ..) | (Char('\r'), _, ALT, ..) | (Char('\n'), _, ALT, ..) => { host.toggle_full_screen(); @@ -775,8 +721,6 @@ impl TerminalState { // Delete (Char('\x7f'), _, _, _, false) | (Delete, _, _, _, false) => "\x7f", (Char('\x7f'), ..) | (Delete, ..) => "\x1b[3~", - (Insert, _, _, SHIFT, _) => paste!(), - (Char('v'), ..) if mods == KeyModifiers::SUPER => paste!(), (Char(c), CTRL, _, SHIFT, _) if c <= 0xff as char && c > 0x40 as char => { // If shift is held we have C == 0x43 and want to translate