use std::ops::Deref;
use wayland_client::commons::Implementation;
use wayland_client::protocol::{wl_compositor, wl_pointer, wl_shm};
use wayland_client::{NewProxy, Proxy, QueueToken};
mod theme;
pub use self::theme::{ThemeManager, ThemedPointer};
pub enum AutoThemer {
Themed(ThemeManager),
UnThemed,
}
impl AutoThemer {
pub fn init(
name: Option<&str>,
compositor: Proxy<wl_compositor::WlCompositor>,
shm: Proxy<wl_shm::WlShm>,
) -> AutoThemer {
match ThemeManager::init(name, compositor, shm) {
Ok(mgr) => AutoThemer::Themed(mgr),
Err(()) => AutoThemer::UnThemed,
}
}
pub fn theme_pointer(&self, pointer: Proxy<wl_pointer::WlPointer>) -> AutoPointer {
match *self {
AutoThemer::Themed(ref mgr) => AutoPointer::Themed(mgr.theme_pointer(pointer)),
AutoThemer::UnThemed => AutoPointer::UnThemed(pointer),
}
}
pub fn theme_pointer_with_impl<Impl>(
&self,
pointer: NewProxy<wl_pointer::WlPointer>,
mut implementation: Impl,
) -> AutoPointer
where
Impl: Implementation<AutoPointer, wl_pointer::Event> + Send + 'static,
{
match *self {
AutoThemer::Themed(ref mgr) => {
let pointer = mgr.theme_pointer_with_impl(pointer, move |event, pointer| {
implementation.receive(event, AutoPointer::Themed(pointer))
});
AutoPointer::Themed(pointer)
}
AutoThemer::UnThemed => {
let pointer = pointer.implement(move |event, pointer| {
implementation.receive(event, AutoPointer::UnThemed(pointer))
});
AutoPointer::UnThemed(pointer)
}
}
}
pub unsafe fn theme_pointer_with_nonsend_impl<Impl>(
&self,
pointer: NewProxy<wl_pointer::WlPointer>,
mut implementation: Impl,
token: &QueueToken,
) -> AutoPointer
where
Impl: Implementation<AutoPointer, wl_pointer::Event> + Send + 'static,
{
match *self {
AutoThemer::Themed(ref mgr) => {
let pointer = mgr.theme_pointer_with_nonsend_impl(
pointer,
move |event, pointer| {
implementation.receive(event, AutoPointer::Themed(pointer))
},
token,
);
AutoPointer::Themed(pointer)
}
AutoThemer::UnThemed => {
let pointer = pointer.implement_nonsend(
move |event, pointer| {
implementation.receive(event, AutoPointer::UnThemed(pointer))
},
token,
);
AutoPointer::UnThemed(pointer)
}
}
}
}
pub enum AutoPointer {
Themed(ThemedPointer),
UnThemed(Proxy<wl_pointer::WlPointer>),
}
impl AutoPointer {
pub fn set_cursor(&self, name: &str, serial: Option<u32>) -> Result<(), ()> {
match *self {
AutoPointer::Themed(ref themed) => themed.set_cursor(name, serial),
AutoPointer::UnThemed(_) => Ok(()),
}
}
}
impl Deref for AutoPointer {
type Target = Proxy<wl_pointer::WlPointer>;
fn deref(&self) -> &Proxy<wl_pointer::WlPointer> {
match *self {
AutoPointer::Themed(ref themed) => &**themed,
AutoPointer::UnThemed(ref ptr) => ptr,
}
}
}
impl Clone for AutoPointer {
fn clone(&self) -> AutoPointer {
match *self {
AutoPointer::Themed(ref themed) => AutoPointer::Themed(themed.clone()),
AutoPointer::UnThemed(ref ptr) => AutoPointer::UnThemed(ptr.clone()),
}
}
}