autocommit 2022-04-05 18:28:42 CEST
This commit is contained in:
parent
1f05ea431e
commit
a3e9f21fc5
29 changed files with 568 additions and 225 deletions
|
|
@ -1,7 +1,6 @@
|
|||
use crate::backend::{BackendEvent, Connector};
|
||||
use crate::backend::{BackendEvent};
|
||||
use crate::state::State;
|
||||
use crate::tasks::input_device;
|
||||
use crate::tasks::output::OutputHandler;
|
||||
use crate::tasks::{connector, input_device};
|
||||
use std::rc::Rc;
|
||||
|
||||
pub struct BackendEventHandler {
|
||||
|
|
@ -18,18 +17,8 @@ impl BackendEventHandler {
|
|||
|
||||
fn handle_event(&mut self, event: BackendEvent) {
|
||||
match event {
|
||||
BackendEvent::NewConnector(output) => self.handle_new_output(output),
|
||||
BackendEvent::NewConnector(connector) => connector::handle(&self.state, &connector),
|
||||
BackendEvent::NewInputDevice(s) => input_device::handle(&self.state, s),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_new_output(&mut self, output: Rc<dyn Connector>) {
|
||||
let id = output.id();
|
||||
let oh = OutputHandler {
|
||||
state: self.state.clone(),
|
||||
output,
|
||||
};
|
||||
let future = self.state.eng.spawn(oh.handle());
|
||||
self.state.output_handlers.borrow_mut().insert(id, future);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
128
src/tasks/connector.rs
Normal file
128
src/tasks/connector.rs
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
use crate::backend::{Connector, ConnectorEvent, ConnectorId, MonitorInfo};
|
||||
use crate::ifs::wl_output::WlOutputGlobal;
|
||||
use crate::rect::Rect;
|
||||
use crate::state::{ConnectorData, State};
|
||||
use crate::tree::{OutputNode, OutputRenderData};
|
||||
use crate::utils::asyncevent::AsyncEvent;
|
||||
use crate::utils::clonecell::CloneCell;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
pub fn handle(state: &Rc<State>, connector: &Rc<dyn Connector>) {
|
||||
let id = connector.id();
|
||||
let data = Rc::new(ConnectorData {
|
||||
connector: connector.clone(),
|
||||
monitor_info: Default::default(),
|
||||
handler: Default::default(),
|
||||
node: Default::default(),
|
||||
});
|
||||
let oh = ConnectorHandler {
|
||||
id,
|
||||
state: state.clone(),
|
||||
data: data.clone(),
|
||||
};
|
||||
let future = state.eng.spawn(oh.handle());
|
||||
data.handler.set(Some(future));
|
||||
state.connectors.set(id, data);
|
||||
}
|
||||
|
||||
struct ConnectorHandler {
|
||||
id: ConnectorId,
|
||||
state: Rc<State>,
|
||||
data: Rc<ConnectorData>,
|
||||
}
|
||||
|
||||
impl ConnectorHandler {
|
||||
async fn handle(self) {
|
||||
let ae = Rc::new(AsyncEvent::default());
|
||||
{
|
||||
let ae = ae.clone();
|
||||
self.data.connector.on_change(Rc::new(move || ae.trigger()));
|
||||
}
|
||||
if let Some(config) = self.state.config.get() {
|
||||
config.new_connector(self.id);
|
||||
}
|
||||
'outer: loop {
|
||||
while let Some(event) = self.data.connector.event() {
|
||||
match event {
|
||||
ConnectorEvent::Removed => break 'outer,
|
||||
ConnectorEvent::Connected(mi) => self.handle_connected(&ae, mi).await,
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
ae.triggered().await;
|
||||
}
|
||||
if let Some(config) = self.state.config.get() {
|
||||
config.del_connector(self.id);
|
||||
}
|
||||
self.data.handler.set(None);
|
||||
self.state.connectors.remove(&self.id);
|
||||
}
|
||||
|
||||
async fn handle_connected(&self, ae: &Rc<AsyncEvent>, info: MonitorInfo) {
|
||||
log::info!("Connector {} connected: {:#?}", self.data.connector.kernel_id(), info);
|
||||
self.data.monitor_info.set(Some(Rc::new(info.clone())));
|
||||
let name = self.state.globals.name();
|
||||
let x1 = self
|
||||
.state
|
||||
.root
|
||||
.outputs
|
||||
.lock()
|
||||
.values()
|
||||
.map(|o| o.global.pos.get().x2())
|
||||
.max()
|
||||
.unwrap_or(0);
|
||||
let global = Rc::new(WlOutputGlobal::new(
|
||||
name,
|
||||
&self.data,
|
||||
x1,
|
||||
&info.initial_mode,
|
||||
&info.manufacturer,
|
||||
&info.product,
|
||||
info.width_mm,
|
||||
info.height_mm,
|
||||
));
|
||||
let on = Rc::new(OutputNode {
|
||||
id: self.state.node_ids.next(),
|
||||
workspaces: Default::default(),
|
||||
workspace: CloneCell::new(None),
|
||||
seat_state: Default::default(),
|
||||
global: global.clone(),
|
||||
layers: Default::default(),
|
||||
render_data: RefCell::new(OutputRenderData {
|
||||
active_workspace: Rect::new_empty(0, 0),
|
||||
inactive_workspaces: Default::default(),
|
||||
titles: Default::default(),
|
||||
}),
|
||||
state: self.state.clone(),
|
||||
is_dummy: false,
|
||||
});
|
||||
self.data.node.set(Some(on.clone()));
|
||||
global.node.set(Some(on.clone()));
|
||||
if let Some(config) = self.state.config.get() {
|
||||
config.connector_connected(self.id);
|
||||
}
|
||||
on.ensure_workspace();
|
||||
self.state.root.outputs.set(self.id, on.clone());
|
||||
self.state.add_global(&global);
|
||||
'outer: loop {
|
||||
while let Some(event) = self.data.connector.event() {
|
||||
match event {
|
||||
ConnectorEvent::Disconnected => break 'outer,
|
||||
ConnectorEvent::ModeChanged(mode) => {
|
||||
on.update_mode(mode);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
ae.triggered().await;
|
||||
}
|
||||
if let Some(config) = self.state.config.get() {
|
||||
config.connector_disconnected(self.id);
|
||||
}
|
||||
self.data.node.take();
|
||||
global.node.set(None);
|
||||
let _ = self.state.remove_global(&*global);
|
||||
self.state.root.outputs.remove(&self.id);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
use crate::backend::{Connector, ConnectorEvent};
|
||||
use crate::ifs::wl_output::WlOutputGlobal;
|
||||
use crate::rect::Rect;
|
||||
use crate::state::State;
|
||||
use crate::tree::{OutputNode, OutputRenderData, WorkspaceNode};
|
||||
use crate::utils::asyncevent::AsyncEvent;
|
||||
use crate::utils::clonecell::CloneCell;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
pub struct OutputHandler {
|
||||
pub state: Rc<State>,
|
||||
pub output: Rc<dyn Connector>,
|
||||
}
|
||||
|
||||
impl OutputHandler {
|
||||
pub async fn handle(self) {
|
||||
let ae = Rc::new(AsyncEvent::default());
|
||||
{
|
||||
let ae = ae.clone();
|
||||
self.output.on_change(Rc::new(move || ae.trigger()));
|
||||
}
|
||||
let name = self.state.globals.name();
|
||||
let x1 = self
|
||||
.state
|
||||
.root
|
||||
.outputs
|
||||
.lock()
|
||||
.values()
|
||||
.map(|o| o.global.pos.get().x2())
|
||||
.max()
|
||||
.unwrap_or(0);
|
||||
let global = Rc::new(WlOutputGlobal::new(name, self.output.clone(), x1));
|
||||
let on = Rc::new(OutputNode {
|
||||
id: self.state.node_ids.next(),
|
||||
workspaces: Default::default(),
|
||||
workspace: CloneCell::new(None),
|
||||
seat_state: Default::default(),
|
||||
global: global.clone(),
|
||||
layers: Default::default(),
|
||||
render_data: RefCell::new(OutputRenderData {
|
||||
active_workspace: Rect::new_empty(0, 0),
|
||||
inactive_workspaces: Default::default(),
|
||||
titles: Default::default(),
|
||||
}),
|
||||
state: self.state.clone(),
|
||||
is_dummy: false,
|
||||
});
|
||||
global.node.set(Some(on.clone()));
|
||||
let name = 'name: {
|
||||
for i in 1.. {
|
||||
let name = i.to_string();
|
||||
if !self.state.workspaces.contains(&name) {
|
||||
break 'name name;
|
||||
}
|
||||
}
|
||||
unreachable!();
|
||||
};
|
||||
let workspace = Rc::new(WorkspaceNode {
|
||||
id: self.state.node_ids.next(),
|
||||
output: CloneCell::new(on.clone()),
|
||||
position: Default::default(),
|
||||
container: Default::default(),
|
||||
stacked: Default::default(),
|
||||
seat_state: Default::default(),
|
||||
name: name.clone(),
|
||||
output_link: Default::default(),
|
||||
});
|
||||
self.state.workspaces.set(name, workspace.clone());
|
||||
workspace
|
||||
.output_link
|
||||
.set(Some(on.workspaces.add_last(workspace.clone())));
|
||||
on.show_workspace(&workspace);
|
||||
on.update_render_data();
|
||||
self.state.root.outputs.set(self.output.id(), on.clone());
|
||||
self.state.add_global(&global);
|
||||
self.state.outputs.set(self.output.id(), global.clone());
|
||||
'outer: loop {
|
||||
while let Some(event) = self.output.event() {
|
||||
match event {
|
||||
ConnectorEvent::Removed => break 'outer,
|
||||
ConnectorEvent::ModeChanged(mode) => {
|
||||
on.update_mode(mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
ae.triggered().await;
|
||||
}
|
||||
global.node.set(None);
|
||||
self.state.outputs.remove(&self.output.id());
|
||||
let _ = self.state.remove_global(&*global);
|
||||
self.state
|
||||
.output_handlers
|
||||
.borrow_mut()
|
||||
.remove(&self.output.id());
|
||||
self.state.root.outputs.remove(&self.output.id());
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue