use libc;
use wayland_sys::server::WAYLAND_SERVER_HANDLE;
use wlroots_sys::wlr_xdg_surface_v6;
use {compositor,
surface,
shell::xdg_shell_v6::{self, SurfaceState},
utils::Handleable};
#[allow(unused_variables)]
pub trait Handler {
fn on_commit(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {}
fn destroyed(&mut self,
compositor_handle: compositor::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {}
fn ping_timeout(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {}
fn new_popup(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {}
fn maximize_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {}
fn minimize_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {}
fn move_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle,
&xdg_shell_v6::event::Move) {
}
fn resize_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle,
&xdg_shell_v6::event::Resize) {
}
fn fullscreen_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle,
&xdg_shell_v6::event::SetFullscreen) {
}
fn show_window_menu_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle,
&xdg_shell_v6::event::ShowWindowMenu) {
}
fn map_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {
}
fn unmap_request(&mut self,
compositor_handle: compositor::Handle,
surface_handle: surface::Handle,
xdg_shell_v6_handle: xdg_shell_v6::Handle) {
}
}
wayland_listener!(pub(crate) XdgShellV6, (xdg_shell_v6::Surface, Option<Box<Handler>>), [
destroy_listener => destroy_notify: |this: &mut XdgShellV6, data: *mut libc::c_void,| unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.destroyed(compositor, shell_surface.weak_reference());
let surface_ptr = data as *mut wlr_xdg_surface_v6;
let shell_state_ptr = (*surface_ptr).data as *mut SurfaceState;
if let Some(shell_ptr) = (*shell_state_ptr).shell {
Box::from_raw(shell_ptr.as_ptr());
}
};
commit_listener => commit_notify: |this: &mut XdgShellV6, _data: *mut libc::c_void,| unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.on_commit(compositor,
surface,
shell_surface.weak_reference());
};
ping_timeout_listener => ping_timeout_notify: |this: &mut XdgShellV6,
_data: *mut libc::c_void,|
unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.ping_timeout(compositor,
surface,
shell_surface.weak_reference());
};
new_popup_listener => new_popup_notify: |this: &mut XdgShellV6, _data: *mut libc::c_void,|
unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.new_popup(compositor,
surface,
shell_surface.weak_reference());
};
maximize_listener => maximize_notify: |this: &mut XdgShellV6, _event: *mut libc::c_void,|
unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.maximize_request(compositor,
surface,
shell_surface.weak_reference());
};
fullscreen_listener => fullscreen_notify: |this: &mut XdgShellV6, event: *mut libc::c_void,|
unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
let event = xdg_shell_v6::event::SetFullscreen::from_ptr(event as _);
manager.fullscreen_request(compositor,
surface,
shell_surface.weak_reference(),
&event);
};
minimize_listener => minimize_notify: |this: &mut XdgShellV6, _event: *mut libc::c_void,|
unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.minimize_request(compositor,
surface,
shell_surface.weak_reference());
};
move_listener => move_notify: |this: &mut XdgShellV6, event: *mut libc::c_void,| unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
let event = xdg_shell_v6::event::Move::from_ptr(event as _);
manager.move_request(compositor,
surface,
shell_surface.weak_reference(),
&event);
};
resize_listener => resize_notify: |this: &mut XdgShellV6, event: *mut libc::c_void,| unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
let event = xdg_shell_v6::event::Resize::from_ptr(event as _);
manager.resize_request(compositor,
surface,
shell_surface.weak_reference(),
&event);
};
show_window_menu_listener => show_window_menu_notify: |this: &mut XdgShellV6,
event: *mut libc::c_void,|
unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
let event = xdg_shell_v6::event::ShowWindowMenu::from_ptr(event as _);
manager.show_window_menu_request(compositor,
surface,
shell_surface.weak_reference(),
&event);
};
map_listener => map_notify: |this: &mut XdgShellV6, _event: *mut libc::c_void,| unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.map_request(compositor,
surface,
shell_surface.weak_reference());
};
unmap_listener => unmap_notify: |this: &mut XdgShellV6, _event: *mut libc::c_void,| unsafe {
let (ref mut shell_surface, ref mut manager) = match &mut this.data {
(_, None) => return,
(ss, Some(manager)) => (ss, manager)
};
let surface = shell_surface.surface();
let compositor = match compositor::handle() {
Some(handle) => handle,
None => return
};
manager.unmap_request(compositor,
surface,
shell_surface.weak_reference());
};
]);
impl XdgShellV6 {
pub(crate) fn surface_mut(&mut self) -> xdg_shell_v6::Handle {
self.data.0.weak_reference()
}
}
impl Drop for XdgShellV6 {
fn drop(&mut self) {
unsafe {
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.destroy_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.commit_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.ping_timeout_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.new_popup_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.maximize_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.fullscreen_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.minimize_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.move_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.resize_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.show_window_menu_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.map_listener()).link as *mut _ as _);
ffi_dispatch!(WAYLAND_SERVER_HANDLE,
wl_list_remove,
&mut (*self.unmap_listener()).link as *mut _ as _);
}
}
}