Make udev example use new auto session

This commit is contained in:
Drakulix 2018-01-27 13:07:35 +01:00
parent a768e298f2
commit 11c9f2b0fb
1 changed files with 30 additions and 11 deletions

View File

@ -39,7 +39,7 @@ use smithay::backend::input::{self, Event, InputBackend, InputHandler, KeyState,
use smithay::backend::libinput::{libinput_bind, LibinputInputBackend, LibinputSessionInterface, use smithay::backend::libinput::{libinput_bind, LibinputInputBackend, LibinputSessionInterface,
PointerAxisEvent as LibinputPointerAxisEvent}; PointerAxisEvent as LibinputPointerAxisEvent};
use smithay::backend::session::{Session, SessionNotifier}; use smithay::backend::session::{Session, SessionNotifier};
use smithay::backend::session::direct::{direct_session_bind, DirectSession}; use smithay::backend::session::auto::{auto_session_bind, AutoSession};
use smithay::backend::udev::{primary_gpu, udev_backend_bind, SessionFdDrmDevice, UdevBackend, UdevHandler}; use smithay::backend::udev::{primary_gpu, udev_backend_bind, SessionFdDrmDevice, UdevBackend, UdevHandler};
use smithay::wayland::compositor::{CompositorToken, SubsurfaceRole, TraversalAction}; use smithay::wayland::compositor::{CompositorToken, SubsurfaceRole, TraversalAction};
use smithay::wayland::compositor::roles::Role; use smithay::wayland::compositor::roles::Role;
@ -67,6 +67,7 @@ struct LibinputInputHandler {
pointer_location: Rc<RefCell<(f64, f64)>>, pointer_location: Rc<RefCell<(f64, f64)>>,
screen_size: (u32, u32), screen_size: (u32, u32),
serial: u32, serial: u32,
session: AutoSession,
running: Arc<AtomicBool>, running: Arc<AtomicBool>,
} }
@ -93,14 +94,32 @@ impl InputHandler<LibinputInputBackend> for LibinputInputHandler {
let keycode = evt.key(); let keycode = evt.key();
let state = evt.state(); let state = evt.state();
debug!(self.log, "key"; "keycode" => keycode, "state" => format!("{:?}", state)); debug!(self.log, "key"; "keycode" => keycode, "state" => format!("{:?}", state));
let serial = self.next_serial(); let serial = self.next_serial();
// we cannot borrow `self` into the closure, because we need self.keyboard.
// but rust does not borrow all fields separately, so we need to do that manually...
let running = &self.running;
let mut session = &mut self.session;
let log = &self.log;
self.keyboard self.keyboard
.input(keycode, state, serial, |modifiers, keysym| { .input(keycode, state, serial, move |modifiers, keysym| {
if modifiers.ctrl && modifiers.alt && keysym == xkb::KEY_BackSpace { debug!(log, "keysym"; "state" => format!("{:?}", state), "mods" => format!("{:?}", modifiers), "keysym" => xkbcommon::xkb::keysym_get_name(keysym));
self.running.store(false, Ordering::SeqCst); if modifiers.ctrl && modifiers.alt && keysym == xkb::KEY_BackSpace && state == KeyState::Pressed {
info!(log, "Stopping example using Ctrl+Alt+Backspace");
running.store(false, Ordering::SeqCst);
false
} else if modifiers.logo && keysym == xkb::KEY_q {
info!(log, "Stopping example using Logo+Q");
running.store(false, Ordering::SeqCst);
false
} else if modifiers.ctrl && modifiers.alt && keysym == xkb::KEY_XF86Switch_VT_1 && state == KeyState::Pressed {
info!(log, "Trying to switch to vt 1");
if let Err(err) = session.change_vt(1) {
error!(log, "Error switching to vt 1: {}", err);
}
false false
} else if modifiers.logo && keysym == xkb::KEY_Return && state == KeyState::Pressed { } else if modifiers.logo && keysym == xkb::KEY_Return && state == KeyState::Pressed {
info!(log, "Launching terminal");
let _ = Command::new("weston-terminal").spawn(); let _ = Command::new("weston-terminal").spawn();
false false
} else { } else {
@ -228,10 +247,9 @@ fn main() {
init_shell(&mut event_loop, log.clone(), active_egl_context.clone()); init_shell(&mut event_loop, log.clone(), active_egl_context.clone());
/* /*
* Initialize session on the current tty * Initialize session
*/ */
let (session, mut notifier) = DirectSession::new(None, log.clone()).unwrap(); let (session, mut notifier) = AutoSession::new(log.clone()).unwrap();
let session = Rc::new(RefCell::new(session));
let running = Arc::new(AtomicBool::new(true)); let running = Arc::new(AtomicBool::new(true));
let r = running.clone(); let r = running.clone();
@ -318,8 +336,8 @@ fn main() {
* Initialize libinput backend * Initialize libinput backend
*/ */
let mut libinput_context = Libinput::new_from_udev::< let mut libinput_context = Libinput::new_from_udev::<
LibinputSessionInterface<Rc<RefCell<DirectSession>>>, LibinputSessionInterface<AutoSession>,
>(session.into(), &context); >(session.clone().into(), &context);
let libinput_session_id = notifier.register(libinput_context.clone()); let libinput_session_id = notifier.register(libinput_context.clone());
libinput_context.udev_assign_seat(&seat).unwrap(); libinput_context.udev_assign_seat(&seat).unwrap();
let mut libinput_backend = LibinputInputBackend::new(libinput_context, log.clone()); let mut libinput_backend = LibinputInputBackend::new(libinput_context, log.clone());
@ -333,12 +351,13 @@ fn main() {
pointer_location, pointer_location,
screen_size: (w, h), screen_size: (w, h),
serial: 0, serial: 0,
session: session,
running: running.clone(), running: running.clone(),
}, },
); );
let libinput_event_source = libinput_bind(libinput_backend, &mut event_loop).unwrap(); let libinput_event_source = libinput_bind(libinput_backend, &mut event_loop).unwrap();
let session_event_source = direct_session_bind(notifier, &mut event_loop, log.clone()).unwrap(); let session_event_source = auto_session_bind(notifier, &mut event_loop).unwrap();
let udev_event_source = udev_backend_bind(&mut event_loop, udev_token).unwrap(); let udev_event_source = udev_backend_bind(&mut event_loop, udev_token).unwrap();
while running.load(Ordering::SeqCst) { while running.load(Ordering::SeqCst) {