diff --git a/src/main.rs b/src/main.rs index 52dc8b6..1881365 100644 --- a/src/main.rs +++ b/src/main.rs @@ -66,6 +66,8 @@ use std::marker::PhantomData; use std::thread; use std::sync::mpsc; use protocol::mojang; +use sdl2::Sdl; +use sdl2::keyboard; const CL_BRAND: console::CVar = console::CVar { ty: PhantomData, @@ -90,6 +92,8 @@ pub struct Game { chunk_builder: chunk_builder::ChunkBuilder, connect_reply: Option>>, + + sdl: Sdl, } impl Game { @@ -226,10 +230,11 @@ fn main() { should_close: false, chunk_builder: chunk_builder::ChunkBuilder::new(resource_manager, textures), connect_reply: None, + sdl: sdl, }; game.renderer.camera.pos = cgmath::Point3::new(0.5, 13.2, 0.5); - let mut events = sdl.event_pump().unwrap(); + let mut events = game.sdl.event_pump().unwrap(); while !game.should_close { let now = time::now(); @@ -277,7 +282,7 @@ fn main() { window.gl_swap_window(); for event in events.poll_iter() { - handle_window_event(&window, &mut game, &mut ui_container, event) + handle_window_event(&window, &mut game, &mut ui_container, event); } } } @@ -361,22 +366,24 @@ fn handle_window_event(window: &sdl2::video::Window, Event::KeyDown{keycode: Some(Keycode::Backquote), ..} => { game.console.lock().unwrap().toggle(); } - Event::KeyDown{keycode: Some(key), ..} => { + Event::KeyDown{keycode: Some(key), keymod, ..} => { if game.focused { if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { game.server.key_press(true, steven_key); } } else { - ui_container.key_press(game, key, true); + let ctrl_pressed = keymod.intersects(keyboard::LCTRLMOD | keyboard::RCTRLMOD); + ui_container.key_press(game, key, true, ctrl_pressed); } } - Event::KeyUp{keycode: Some(key), ..} => { + Event::KeyUp{keycode: Some(key), keymod, ..} => { if game.focused { if let Some(steven_key) = settings::Stevenkey::get_by_keycode(key, &game.vars) { game.server.key_press(false, steven_key); } } else { - ui_container.key_press(game, key, false); + let ctrl_pressed = keymod.intersects(keyboard::LCTRLMOD | keyboard::RCTRLMOD); + ui_container.key_press(game, key, false, ctrl_pressed); } } Event::TextInput{text, ..} => { diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 39343c3..1f866af 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -183,12 +183,12 @@ macro_rules! define_elements { } } - fn key_press(&self, game: &mut ::Game, key: Keycode, down: bool) { + fn key_press(&self, game: &mut ::Game, key: Keycode, down: bool, ctrl_pressed: bool) { match *self { $( Element::$name(ref inner) => { let mut el = inner.borrow_mut(); - el.key_press(game, key, down); + el.key_press(game, key, down, ctrl_pressed); }, )* } @@ -395,7 +395,7 @@ impl Container { focusables[next_focus].set_focused(true); } - pub fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool) { + pub fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool, ctrl_pressed: bool) { if key == Keycode::Tab { if !down { self.cycle_focus(); @@ -405,7 +405,7 @@ impl Container { for el in self.focusable_elements.iter() .flat_map(|v| v.upgrade()) { if el.is_focused() { - el.key_press(game, key, down); + el.key_press(game, key, down, ctrl_pressed); } } } @@ -465,7 +465,7 @@ trait UIElement { fn get_size(&self) -> (f64, f64); fn is_dirty(&self) -> bool; fn post_init(_: Rc>) {} - fn key_press(&mut self, _game: &mut ::Game, _key: Keycode, _down: bool) {} + fn key_press(&mut self, _game: &mut ::Game, _key: Keycode, _down: bool, _ctrl_pressed: bool) {} fn key_type(&mut self, _game: &mut ::Game, _c: char) {} fn tick(&mut self, renderer: &mut render::Renderer); } @@ -1309,7 +1309,7 @@ impl TextBoxBuilder { } impl UIElement for TextBox { - fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool) { + fn key_press(&mut self, game: &mut ::Game, key: Keycode, down: bool, ctrl_pressed: bool) { match (key, down) { (Keycode::Backspace, false) => {self.input.pop();}, (Keycode::Return, false) => { @@ -1321,6 +1321,15 @@ impl UIElement for TextBox { } self.submit_funcs.append(&mut temp); }, + (Keycode::V, true) => { + if ctrl_pressed { + let clipboard = game.sdl.video().unwrap().clipboard(); + if clipboard.has_clipboard_text() { + let text = clipboard.clipboard_text().unwrap(); + self.input.push_str(&text); + } + } + }, _ => {}, } }