Add set_output_metadata
This commit is contained in:
parent
109f4035e8
commit
9b6273f297
|
@ -5,7 +5,7 @@ use backend::{SeatInternal, TouchSlotInternal};
|
||||||
use backend::graphics::GraphicsBackend;
|
use backend::graphics::GraphicsBackend;
|
||||||
use backend::graphics::opengl::{Api, OpenglGraphicsBackend, PixelFormat, SwapBuffersError};
|
use backend::graphics::opengl::{Api, OpenglGraphicsBackend, PixelFormat, SwapBuffersError};
|
||||||
use backend::input::{Axis, AxisSource, InputBackend, InputHandler, KeyState, MouseButton, MouseButtonState,
|
use backend::input::{Axis, AxisSource, InputBackend, InputHandler, KeyState, MouseButton, MouseButtonState,
|
||||||
Seat, SeatCapabilities, TouchEvent, TouchSlot};
|
Seat, SeatCapabilities, TouchEvent, TouchSlot, Output};
|
||||||
use glutin::{Api as GlutinApi, MouseButton as GlutinMouseButton, PixelFormat as GlutinPixelFormat};
|
use glutin::{Api as GlutinApi, MouseButton as GlutinMouseButton, PixelFormat as GlutinPixelFormat};
|
||||||
use glutin::{ContextError, CreationError, ElementState, Event, GlContext, HeadlessContext,
|
use glutin::{ContextError, CreationError, ElementState, Event, GlContext, HeadlessContext,
|
||||||
HeadlessRendererBuilder, MouseScrollDelta, Touch, TouchPhase, Window, WindowBuilder};
|
HeadlessRendererBuilder, MouseScrollDelta, Touch, TouchPhase, Window, WindowBuilder};
|
||||||
|
@ -376,6 +376,8 @@ impl InputBackend for GlutinInputBackend {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_output_metadata(&mut self, seat: &Seat, output: &Output) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GlutinInputBackend {
|
impl GlutinInputBackend {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
use backend::{SeatInternal, TouchSlotInternal};
|
use backend::{SeatInternal, TouchSlotInternal};
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
use std::hash::Hash;
|
||||||
|
|
||||||
/// A seat describes a group of input devices and at least one
|
/// A seat describes a group of input devices and at least one
|
||||||
/// graphics device belonging together.
|
/// graphics device belonging together.
|
||||||
|
@ -64,6 +65,20 @@ pub struct SeatCapabilities {
|
||||||
pub touch: bool,
|
pub touch: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Maybe refactor this into a struct or move to a more appropriate
|
||||||
|
// module once fleshed out
|
||||||
|
|
||||||
|
/// Describes a general output that can be focused by a `Seat`.
|
||||||
|
pub trait Output {
|
||||||
|
/// Returns size in pixels (width, height)
|
||||||
|
fn size(&self) -> (u32, u32);
|
||||||
|
|
||||||
|
/// Returns width in pixels
|
||||||
|
fn width(&self) -> u32;
|
||||||
|
/// Returns height in pixels
|
||||||
|
fn height(&self) -> u32;
|
||||||
|
}
|
||||||
|
|
||||||
/// State of key on a keyboard. Either pressed or released
|
/// State of key on a keyboard. Either pressed or released
|
||||||
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||||
pub enum KeyState {
|
pub enum KeyState {
|
||||||
|
@ -216,6 +231,9 @@ pub trait InputBackend: Sized {
|
||||||
/// Get current `InputConfig`
|
/// Get current `InputConfig`
|
||||||
fn input_config(&mut self) -> &mut Self::InputConfig;
|
fn input_config(&mut self) -> &mut Self::InputConfig;
|
||||||
|
|
||||||
|
/// Called to inform the Input backend about a new focused Output for a `Seat`
|
||||||
|
fn set_output_metadata(&mut self, seat: &Seat, output: &Output);
|
||||||
|
|
||||||
/// Processes new events of the underlying backend and drives the `InputHandler`.
|
/// Processes new events of the underlying backend and drives the `InputHandler`.
|
||||||
fn dispatch_new_events(&mut self) -> Result<(), Self::EventError>;
|
fn dispatch_new_events(&mut self) -> Result<(), Self::EventError>;
|
||||||
}
|
}
|
||||||
|
@ -232,7 +250,6 @@ pub trait InputHandler<B: InputBackend> {
|
||||||
///
|
///
|
||||||
/// It is not guaranteed that any change has actually happened.
|
/// It is not guaranteed that any change has actually happened.
|
||||||
fn on_seat_changed(&mut self, seat: &Seat);
|
fn on_seat_changed(&mut self, seat: &Seat);
|
||||||
|
|
||||||
/// Called when a new keyboard event was received.
|
/// Called when a new keyboard event was received.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Implementation of input backend trait for types provided by `libinput`
|
//! Implementation of input backend trait for types provided by `libinput`
|
||||||
|
|
||||||
use backend::SeatInternal;
|
use backend::{SeatInternal, TouchSlotInternal};
|
||||||
use backend::input::{InputBackend, InputHandler, Seat, SeatCapabilities, MouseButton};
|
use backend::input::{InputBackend, InputHandler, Seat, SeatCapabilities, MouseButton, TouchEvent as BackendTouchEvent, TouchSlot as BackendTouchSlot, Output};
|
||||||
use input::{Libinput, Device, Seat as LibinputSeat, DeviceCapability};
|
use input::{Libinput, Device, Seat as LibinputSeat, DeviceCapability};
|
||||||
use input::event::*;
|
use input::event::*;
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ use std::hash::{Hash, Hasher};
|
||||||
struct SeatDesc {
|
struct SeatDesc {
|
||||||
seat: Seat,
|
seat: Seat,
|
||||||
pointer: (u32, u32),
|
pointer: (u32, u32),
|
||||||
|
size: (u32, u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Libinput based `InputBackend`.
|
/// Libinput based `InputBackend`.
|
||||||
|
@ -118,7 +119,8 @@ impl InputBackend for LibinputInputBackend {
|
||||||
seat_entry.key().hash(&mut hasher);
|
seat_entry.key().hash(&mut hasher);
|
||||||
let desc = seat_entry.insert(SeatDesc {
|
let desc = seat_entry.insert(SeatDesc {
|
||||||
seat: Seat::new(hasher.finish(), new_caps),
|
seat: Seat::new(hasher.finish(), new_caps),
|
||||||
pointer: (0, 0) //FIXME: What position to assume? Maybe center of the screen instead. Probably call `set_cursor_position` after this.
|
pointer: (0, 0), //FIXME: We should not assume a position. Some backends might force a position on us.
|
||||||
|
size: (1280, 800), //FIXME: Document the requirement of calling `set_output_metadata` on `on_seat_created`.
|
||||||
});
|
});
|
||||||
if let Some(ref mut handler) = self.handler {
|
if let Some(ref mut handler) = self.handler {
|
||||||
trace!(self.logger, "Calling on_seat_created with {:?}", desc.seat);
|
trace!(self.logger, "Calling on_seat_created with {:?}", desc.seat);
|
||||||
|
@ -174,9 +176,28 @@ impl InputBackend for LibinputInputBackend {
|
||||||
use ::input::event::touch::*;
|
use ::input::event::touch::*;
|
||||||
if let Some(ref mut handler) = self.handler {
|
if let Some(ref mut handler) = self.handler {
|
||||||
let device_seat = touch_event.device().seat();
|
let device_seat = touch_event.device().seat();
|
||||||
|
let desc = self.seats.get(&device_seat).expect("Recieved key event of non existing Seat");
|
||||||
trace!(self.logger, "Calling on_touch with {:?}", touch_event);
|
trace!(self.logger, "Calling on_touch with {:?}", touch_event);
|
||||||
handler.on_touch(&self.seats.get(&device_seat).expect("Recieved key event of non existing Seat").seat,
|
handler.on_touch(&desc.seat, touch_event.time(),
|
||||||
touch_event.time(), touch_event.into())
|
match touch_event {
|
||||||
|
TouchEvent::Down(down_event) => BackendTouchEvent::Down {
|
||||||
|
slot: down_event.slot().map(|x| BackendTouchSlot::new(x)),
|
||||||
|
x: down_event.x_transformed(desc.size.0),
|
||||||
|
y: down_event.x_transformed(desc.size.1),
|
||||||
|
},
|
||||||
|
TouchEvent::Motion(motion_event) => BackendTouchEvent::Motion {
|
||||||
|
slot: motion_event.slot().map(|x| BackendTouchSlot::new(x)),
|
||||||
|
x: motion_event.x_transformed(desc.size.0),
|
||||||
|
y: motion_event.x_transformed(desc.size.1),
|
||||||
|
},
|
||||||
|
TouchEvent::Up(up_event) => BackendTouchEvent::Up {
|
||||||
|
slot: up_event.slot().map(|x| BackendTouchSlot::new(x)),
|
||||||
|
},
|
||||||
|
TouchEvent::Cancel(cancel_event) => BackendTouchEvent::Cancel {
|
||||||
|
slot: cancel_event.slot().map(|x| BackendTouchSlot::new(x)),
|
||||||
|
},
|
||||||
|
TouchEvent::Frame(_) => ::backend::input::TouchEvent::Frame,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Event::Keyboard(keyboard_event) => {
|
Event::Keyboard(keyboard_event) => {
|
||||||
|
@ -209,10 +230,8 @@ impl InputBackend for LibinputInputBackend {
|
||||||
let device_seat = motion_event.device().seat();
|
let device_seat = motion_event.device().seat();
|
||||||
let desc = self.seats.get_mut(&device_seat).expect("Recieved pointer event of non existing Seat");
|
let desc = self.seats.get_mut(&device_seat).expect("Recieved pointer event of non existing Seat");
|
||||||
desc.pointer = (
|
desc.pointer = (
|
||||||
motion_event.absolute_x_transformed(
|
motion_event.absolute_x_transformed(desc.size.0) as u32,
|
||||||
/*FIXME: global.get_focused_output_for_seat(&desc.seat).width() or something like that*/ 1280) as u32,
|
motion_event.absolute_y_transformed(desc.size.1) as u32,
|
||||||
motion_event.absolute_y_transformed(
|
|
||||||
/*FIXME: global.get_focused_output_for_seat(&desc.seat).height() or something like that*/ 800) as u32,
|
|
||||||
);
|
);
|
||||||
if let Some(ref mut handler) = self.handler {
|
if let Some(ref mut handler) = self.handler {
|
||||||
trace!(self.logger, "Calling on_pointer_move with {:?}", desc.pointer);
|
trace!(self.logger, "Calling on_pointer_move with {:?}", desc.pointer);
|
||||||
|
@ -263,6 +282,16 @@ impl InputBackend for LibinputInputBackend {
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_output_metadata(&mut self, seat: &Seat, output: &Output) {
|
||||||
|
for desc in self.seats.values_mut() {
|
||||||
|
if desc.seat == *seat {
|
||||||
|
desc.size = output.size();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic!("Got metadata for non-existant seat");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<::input::event::keyboard::KeyState> for ::backend::input::KeyState {
|
impl From<::input::event::keyboard::KeyState> for ::backend::input::KeyState {
|
||||||
|
@ -293,30 +322,3 @@ impl From<::input::event::pointer::ButtonState> for ::backend::input::MouseButto
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<::input::event::touch::TouchEvent> for ::backend::input::TouchEvent {
|
|
||||||
fn from(libinput: ::input::event::touch::TouchEvent) -> Self {
|
|
||||||
use ::input::event::touch::{TouchEventSlot, TouchEventPosition};
|
|
||||||
use ::backend::TouchSlotInternal;
|
|
||||||
|
|
||||||
match libinput {
|
|
||||||
::input::event::touch::TouchEvent::Down(down_event) => ::backend::input::TouchEvent::Down {
|
|
||||||
slot: down_event.slot().map(|x| ::backend::input::TouchSlot::new(x)),
|
|
||||||
x: down_event.x_transformed(/*FIXME: global.get_focused_output_for_seat(&desc.seat).width() or something like that*/ 1280),
|
|
||||||
y: down_event.x_transformed(/*FIXME: global.get_focused_output_for_seat(&desc.seat).height() or something like that*/ 800),
|
|
||||||
},
|
|
||||||
::input::event::touch::TouchEvent::Motion(motion_event) => ::backend::input::TouchEvent::Motion {
|
|
||||||
slot: motion_event.slot().map(|x| ::backend::input::TouchSlot::new(x)),
|
|
||||||
x: motion_event.x_transformed(/*FIXME: global.get_focused_output_for_seat(&desc.seat).width() or something like that*/ 1280),
|
|
||||||
y: motion_event.x_transformed(/*FIXME: global.get_focused_output_for_seat(&desc.seat).height() or something like that*/ 800),
|
|
||||||
},
|
|
||||||
::input::event::touch::TouchEvent::Up(up_event) => ::backend::input::TouchEvent::Up {
|
|
||||||
slot: up_event.slot().map(|x| ::backend::input::TouchSlot::new(x)),
|
|
||||||
},
|
|
||||||
::input::event::touch::TouchEvent::Cancel(cancel_event) => ::backend::input::TouchEvent::Cancel {
|
|
||||||
slot: cancel_event.slot().map(|x| ::backend::input::TouchSlot::new(x)),
|
|
||||||
},
|
|
||||||
::input::event::touch::TouchEvent::Frame(_) => ::backend::input::TouchEvent::Frame,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue