wayland: dispatcher: move overriding visibility manager to root

D-Bus support is large, and should have an option to be excluded. Move
the struct implementing D-Bus support from the dispatcher to the main
file, so it can be replaced with a stub.
This commit is contained in:
Richard Acayan 2024-07-25 18:20:00 -04:00
parent 15c9402b99
commit 379ac88a5a
2 changed files with 23 additions and 30 deletions

View file

@ -20,6 +20,21 @@ use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
use tokio::task; use tokio::task;
use wayland_client::globals; use wayland_client::globals;
use zbus::InterfaceRef;
pub struct VisibilityManager(InterfaceRef<OSK0<Dispatcher>>);
impl VisibilityManager {
pub fn set_visible(&self, visible: bool)
{
let osk = self.0.clone();
task::spawn(async move {
let osk = osk.get().await;
osk.set_visible(visible).await;
});
}
}
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]
async fn main() async fn main()
@ -48,7 +63,7 @@ async fn main()
let gfx = dispatcher.graphics(); let gfx = dispatcher.graphics();
let osk = OSK0::start(&conn_zbus, gfx, conn_wl.clone()).await; let osk = OSK0::start(&conn_zbus, gfx, conn_wl.clone()).await;
match osk { match osk {
Ok(k) => dispatcher.set_osk(k), Ok(k) => dispatcher.set_osk(VisibilityManager(k)),
Err(e) => eprintln!("warn: bind to sm.puri.OSK0 failed: {}", e), Err(e) => eprintln!("warn: bind to sm.puri.OSK0 failed: {}", e),
} }

View file

@ -3,11 +3,11 @@
* Copyright (c) 2024, Richard Acayan. All rights reserved. * Copyright (c) 2024, Richard Acayan. All rights reserved.
*/ */
use crate::VisibilityManager;
use crate::core::Button; use crate::core::Button;
use crate::core::Display; use crate::core::Display;
use crate::core::Graphics; use crate::core::Graphics;
use crate::core::Layout; use crate::core::Layout;
use crate::dbus::osk::OSK0;
use crate::wayland::Seat; use crate::wayland::Seat;
use crate::wayland::Surface; use crate::wayland::Surface;
use crate::wayland::VirtualKeyboard; use crate::wayland::VirtualKeyboard;
@ -24,7 +24,6 @@ use crate::wayland::virtual_keyboard_unstable_v1::zwp_virtual_keyboard_v1;
use std::io::Error; use std::io::Error;
use std::sync::Arc; use std::sync::Arc;
use std::sync::Mutex; use std::sync::Mutex;
use tokio::task;
use wayland_client::Connection; use wayland_client::Connection;
use wayland_client::Dispatch; use wayland_client::Dispatch;
use wayland_client::Proxy; use wayland_client::Proxy;
@ -41,12 +40,11 @@ use wayland_client::protocol::wl_shm;
use wayland_client::protocol::wl_shm_pool; use wayland_client::protocol::wl_shm_pool;
use wayland_client::protocol::wl_surface; use wayland_client::protocol::wl_surface;
use wayland_client::protocol::wl_touch; use wayland_client::protocol::wl_touch;
use zbus::InterfaceRef;
pub struct Dispatcher { pub struct Dispatcher {
seat: Seat<Surface<Self>, VirtualKeyboard, Self>, seat: Seat<Surface<Self>, VirtualKeyboard, Self>,
gfx: Arc<Mutex<Graphics<Surface<Self>>>>, gfx: Arc<Mutex<Graphics<Surface<Self>>>>,
osk: Option<InterfaceRef<OSK0<Self>>>, osk: Option<VisibilityManager>,
} }
impl Dispatcher { impl Dispatcher {
@ -103,13 +101,15 @@ impl Dispatcher {
self.seat.button() self.seat.button()
} }
#[allow(dead_code)]
#[inline(always)] #[inline(always)]
pub fn graphics(&self) -> Arc<Mutex<Graphics<Surface<Self>>>> pub fn graphics(&self) -> Arc<Mutex<Graphics<Surface<Self>>>>
{ {
self.gfx.clone() self.gfx.clone()
} }
pub fn set_osk(&mut self, osk: InterfaceRef<OSK0<Self>>) #[allow(dead_code)]
pub fn set_osk(&mut self, osk: VisibilityManager)
{ {
self.osk = Some(osk); self.osk = Some(osk);
} }
@ -122,18 +122,7 @@ impl Dispatcher {
fn show(&self) fn show(&self)
{ {
match &self.osk { match &self.osk {
Some(osk) => { Some(osk) => osk.set_visible(true),
/*
* Clone the reference from the struct so it can be given to the
* spawned task.
*/
let osk = osk.clone();
task::spawn(async move {
let osk = osk.get().await;
osk.set_visible(true).await;
});
},
None => { None => {
let mut gfx = self.gfx.lock().unwrap(); let mut gfx = self.gfx.lock().unwrap();
gfx.display_mut().show(); gfx.display_mut().show();
@ -144,18 +133,7 @@ impl Dispatcher {
fn hide(&self) fn hide(&self)
{ {
match &self.osk { match &self.osk {
Some(osk) => { Some(osk) => osk.set_visible(false),
/*
* Clone the reference from the struct so it can be given to the
* spawned task.
*/
let osk = osk.clone();
task::spawn(async move {
let osk = osk.get().await;
osk.set_visible(false).await;
});
},
None => { None => {
let mut gfx = self.gfx.lock().unwrap(); let mut gfx = self.gfx.lock().unwrap();
gfx.display_mut().hide(); gfx.display_mut().hide();