| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use std::path::Path; |
| |
| use base::AsRawDescriptor; |
| use base::RawDescriptor; |
| use base::WaitContext; |
| |
| use crate::gpu_display_wl::DisplayWl; |
| use crate::DisplayEventToken; |
| use crate::DisplayT; |
| use crate::EventDevice; |
| use crate::GpuDisplay; |
| use crate::GpuDisplayExt; |
| use crate::GpuDisplayResult; |
| |
| pub(crate) trait UnixDisplayT: DisplayT {} |
| |
| impl GpuDisplayExt for GpuDisplay { |
| fn import_event_device(&mut self, event_device: EventDevice) -> GpuDisplayResult<u32> { |
| let new_event_device_id = self.next_id; |
| |
| self.wait_ctx.add( |
| &event_device, |
| DisplayEventToken::EventDevice { |
| event_device_id: new_event_device_id, |
| }, |
| )?; |
| self.event_devices.insert(new_event_device_id, event_device); |
| |
| self.next_id += 1; |
| Ok(new_event_device_id) |
| } |
| |
| fn handle_event_device(&mut self, event_device_id: u32) { |
| if let Some(event_device) = self.event_devices.get(&event_device_id) { |
| // TODO(zachr): decode the event and forward to the device. |
| let _ = event_device.recv_event_encoded(); |
| } |
| } |
| } |
| |
| pub trait UnixGpuDisplayExt { |
| /// Opens a fresh connection to the compositor. |
| fn open_wayland<P: AsRef<Path>>(wayland_path: Option<P>) -> GpuDisplayResult<GpuDisplay>; |
| } |
| |
| impl UnixGpuDisplayExt for GpuDisplay { |
| fn open_wayland<P: AsRef<Path>>(wayland_path: Option<P>) -> GpuDisplayResult<GpuDisplay> { |
| let display = match wayland_path { |
| Some(s) => DisplayWl::new(Some(s.as_ref()))?, |
| None => DisplayWl::new(None)?, |
| }; |
| |
| let wait_ctx = WaitContext::new()?; |
| wait_ctx.add(&display, DisplayEventToken::Display)?; |
| |
| Ok(GpuDisplay { |
| inner: Box::new(display), |
| next_id: 1, |
| event_devices: Default::default(), |
| surfaces: Default::default(), |
| wait_ctx, |
| }) |
| } |
| } |
| |
| impl AsRawDescriptor for GpuDisplay { |
| fn as_raw_descriptor(&self) -> RawDescriptor { |
| self.wait_ctx.as_raw_descriptor() |
| } |
| } |