config: add Connector::set_enabled
This commit is contained in:
parent
4bbca6abdc
commit
30aa6de35c
8 changed files with 61 additions and 4 deletions
|
|
@ -440,6 +440,10 @@ impl Client {
|
||||||
self.send(&ClientMessage::ConnectorSetPosition { connector, x, y });
|
self.send(&ClientMessage::ConnectorSetPosition { connector, x, y });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn connector_set_enabled(&self, connector: Connector, enabled: bool) {
|
||||||
|
self.send(&ClientMessage::ConnectorSetEnabled { connector, enabled });
|
||||||
|
}
|
||||||
|
|
||||||
pub fn device_connectors(&self, device: DrmDevice) -> Vec<Connector> {
|
pub fn device_connectors(&self, device: DrmDevice) -> Vec<Connector> {
|
||||||
let res = self.send_with_response(&ClientMessage::GetDeviceConnectors { device });
|
let res = self.send_with_response(&ClientMessage::GetDeviceConnectors { device });
|
||||||
get_response!(res, vec![], GetDeviceConnectors { connectors });
|
get_response!(res, vec![], GetDeviceConnectors { connectors });
|
||||||
|
|
|
||||||
|
|
@ -308,6 +308,10 @@ pub enum ClientMessage<'a> {
|
||||||
DisablePointerConstraint {
|
DisablePointerConstraint {
|
||||||
seat: Seat,
|
seat: Seat,
|
||||||
},
|
},
|
||||||
|
ConnectorSetEnabled {
|
||||||
|
connector: Connector,
|
||||||
|
enabled: bool,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Encode, Decode, Debug)]
|
#[derive(Encode, Decode, Debug)]
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,17 @@ impl Connector {
|
||||||
}
|
}
|
||||||
get!().connector_set_position(self, x, y);
|
get!().connector_set_position(self, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Enables or disables the connector.
|
||||||
|
///
|
||||||
|
/// By default, all connectors are enabled.
|
||||||
|
pub fn set_enabled(self, enabled: bool) {
|
||||||
|
if !self.exists() {
|
||||||
|
log::warn!("set_enabled called on a connector that does not exist");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
get!().connector_set_enabled(self, enabled);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns all available DRM devices.
|
/// Returns all available DRM devices.
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,7 @@ pub trait Connector {
|
||||||
fn on_change(&self, cb: Rc<dyn Fn()>);
|
fn on_change(&self, cb: Rc<dyn Fn()>);
|
||||||
fn damage(&self);
|
fn damage(&self);
|
||||||
fn drm_dev(&self) -> Option<DrmDeviceId>;
|
fn drm_dev(&self) -> Option<DrmDeviceId>;
|
||||||
|
fn set_enabled(&self, enabled: bool);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
|
||||||
|
|
@ -52,4 +52,8 @@ impl Connector for DummyOutput {
|
||||||
fn drm_dev(&self) -> Option<DrmDeviceId> {
|
fn drm_dev(&self) -> Option<DrmDeviceId> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_enabled(&self, _enabled: bool) {
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,8 @@ pub struct MetalConnector {
|
||||||
pub buffers: CloneCell<Option<Rc<[RenderBuffer; 2]>>>,
|
pub buffers: CloneCell<Option<Rc<[RenderBuffer; 2]>>>,
|
||||||
pub next_buffer: NumCell<usize>,
|
pub next_buffer: NumCell<usize>,
|
||||||
|
|
||||||
|
pub enabled: Cell<bool>,
|
||||||
|
|
||||||
pub can_present: Cell<bool>,
|
pub can_present: Cell<bool>,
|
||||||
pub has_damage: Cell<bool>,
|
pub has_damage: Cell<bool>,
|
||||||
pub cursor_changed: Cell<bool>,
|
pub cursor_changed: Cell<bool>,
|
||||||
|
|
@ -300,7 +302,7 @@ impl MetalConnector {
|
||||||
|
|
||||||
fn connected(&self) -> bool {
|
fn connected(&self) -> bool {
|
||||||
let dd = self.display.borrow_mut();
|
let dd = self.display.borrow_mut();
|
||||||
dd.connection == ConnectorStatus::Connected && self.primary_plane.get().is_some()
|
self.enabled.get() && dd.connection == ConnectorStatus::Connected && self.primary_plane.get().is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_event(&self, event: ConnectorEvent) {
|
fn send_event(&self, event: ConnectorEvent) {
|
||||||
|
|
@ -434,6 +436,19 @@ impl Connector for MetalConnector {
|
||||||
fn drm_dev(&self) -> Option<DrmDeviceId> {
|
fn drm_dev(&self) -> Option<DrmDeviceId> {
|
||||||
Some(self.dev.id)
|
Some(self.dev.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_enabled(&self, enabled: bool) {
|
||||||
|
if self.enabled.replace(enabled) != enabled {
|
||||||
|
if self.display.borrow_mut().connection == ConnectorStatus::Connected {
|
||||||
|
if let Some(dev) = self.backend.device_holder.drm_devices.get(&self.dev.devnum) {
|
||||||
|
if let Err(e) = self.backend.handle_drm_change_(&dev, true) {
|
||||||
|
dev.unprocessed_change.set(true);
|
||||||
|
log::error!("Could not dis/enable connector: {}", ErrorFmt(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -533,6 +548,7 @@ fn create_connector(
|
||||||
events: Default::default(),
|
events: Default::default(),
|
||||||
buffers: Default::default(),
|
buffers: Default::default(),
|
||||||
next_buffer: Default::default(),
|
next_buffer: Default::default(),
|
||||||
|
enabled: Cell::new(true),
|
||||||
can_present: Cell::new(true),
|
can_present: Cell::new(true),
|
||||||
has_damage: Cell::new(true),
|
has_damage: Cell::new(true),
|
||||||
primary_plane: Default::default(),
|
primary_plane: Default::default(),
|
||||||
|
|
@ -959,7 +975,7 @@ impl MetalBackend {
|
||||||
let mut old = c.display.borrow_mut();
|
let mut old = c.display.borrow_mut();
|
||||||
mem::swap(old.deref_mut(), &mut dd);
|
mem::swap(old.deref_mut(), &mut dd);
|
||||||
if c.connect_sent.get() {
|
if c.connect_sent.get() {
|
||||||
if old.connection != ConnectorStatus::Connected || !old.is_same_monitor(&dd) {
|
if !c.enabled.get() || old.connection != ConnectorStatus::Connected || !old.is_same_monitor(&dd) {
|
||||||
c.send_event(ConnectorEvent::Disconnected);
|
c.send_event(ConnectorEvent::Disconnected);
|
||||||
c.connect_sent.set(false);
|
c.connect_sent.set(false);
|
||||||
} else if preserve_any {
|
} else if preserve_any {
|
||||||
|
|
@ -1451,7 +1467,7 @@ impl MetalBackend {
|
||||||
|
|
||||||
for connector in dev.connectors.lock().values() {
|
for connector in dev.connectors.lock().values() {
|
||||||
let dd = connector.display.borrow_mut();
|
let dd = connector.display.borrow_mut();
|
||||||
if dd.connection != ConnectorStatus::Connected {
|
if !connector.enabled.get() || dd.connection != ConnectorStatus::Connected {
|
||||||
if dd.crtc_id.value.get().is_some() {
|
if dd.crtc_id.value.get().is_some() {
|
||||||
log::debug!("Connector is not connected but has an assigned crtc");
|
log::debug!("Connector is not connected but has an assigned crtc");
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -1586,7 +1602,7 @@ impl MetalBackend {
|
||||||
changes: &mut Change,
|
changes: &mut Change,
|
||||||
) -> Result<(), MetalError> {
|
) -> Result<(), MetalError> {
|
||||||
let dd = connector.display.borrow_mut();
|
let dd = connector.display.borrow_mut();
|
||||||
if dd.connection != ConnectorStatus::Connected {
|
if !connector.enabled.get() || dd.connection != ConnectorStatus::Connected {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
let crtc = 'crtc: {
|
let crtc = 'crtc: {
|
||||||
|
|
|
||||||
|
|
@ -968,6 +968,10 @@ impl Connector for XOutput {
|
||||||
fn drm_dev(&self) -> Option<DrmDeviceId> {
|
fn drm_dev(&self) -> Option<DrmDeviceId> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_enabled(&self, _enabled: bool) {
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct XSeat {
|
struct XSeat {
|
||||||
|
|
|
||||||
|
|
@ -686,6 +686,16 @@ impl ConfigProxyHandler {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_connector_set_enabled(
|
||||||
|
&self,
|
||||||
|
connector: Connector,
|
||||||
|
enabled: bool,
|
||||||
|
) -> Result<(), CphError> {
|
||||||
|
let connector = self.get_connector(connector)?;
|
||||||
|
connector.connector.set_enabled(enabled);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_get_connector(
|
fn handle_get_connector(
|
||||||
&self,
|
&self,
|
||||||
ty: jay_config::video::connector_type::ConnectorType,
|
ty: jay_config::video::connector_type::ConnectorType,
|
||||||
|
|
@ -1125,6 +1135,9 @@ impl ConfigProxyHandler {
|
||||||
ClientMessage::ConnectorSetPosition { connector, x, y } => self
|
ClientMessage::ConnectorSetPosition { connector, x, y } => self
|
||||||
.handle_connector_set_position(connector, x, y)
|
.handle_connector_set_position(connector, x, y)
|
||||||
.wrn("connector_set_position")?,
|
.wrn("connector_set_position")?,
|
||||||
|
ClientMessage::ConnectorSetEnabled { connector, enabled } => self
|
||||||
|
.handle_connector_set_enabled(connector, enabled)
|
||||||
|
.wrn("connector_set_enabled")?,
|
||||||
ClientMessage::Close { seat } => self.handle_close(seat).wrn("close")?,
|
ClientMessage::Close { seat } => self.handle_close(seat).wrn("close")?,
|
||||||
ClientMessage::SetStatus { status } => self.handle_set_status(status),
|
ClientMessage::SetStatus { status } => self.handle_set_status(status),
|
||||||
ClientMessage::GetTimer { name } => self.handle_get_timer(name).wrn("get_timer")?,
|
ClientMessage::GetTimer { name } => self.handle_get_timer(name).wrn("get_timer")?,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue