diff --git a/src/display.rs b/src/display.rs new file mode 100644 index 0000000..df3cb63 --- /dev/null +++ b/src/display.rs @@ -0,0 +1,31 @@ +use std::{io::Error, ptr::NonNull}; +use std::io::{ErrorKind, Result}; + +// pull in the ffi-bindings +use crate::ffi::{wl_display, + wl_display_create, wl_display_destroy, wl_display_destroy_clients, wl_display_add_client_created_listener, + wl_display_add_destroy_listener, wl_display_add_global, wl_display_add_protocol_logger, wl_display_add_shm_format, + wl_display_add_socket, wl_display_add_socket_auto, wl_display_add_socket_fd, wl_display_flush_clients, wl_display_run, + wl_display_get_client_list, wl_display_get_destroy_listener, wl_display_get_event_loop, wl_display_get_serial, + wl_display_init_shm, wl_display_next_serial, wl_display_remove_global, wl_display_set_global_filter, wl_display_terminate +}; + +pub struct Display { + raw: NonNull, +} +impl Display { + pub fn new() -> Result { + let ptr = unsafe { wl_display_create() }; + let raw = match NonNull::::new(ptr) { + Some(raw) => raw, + None => return Err(Error::new(ErrorKind::AddrNotAvailable, "cannot create display")), + }; + + Ok(Self { raw }) + } +} +impl Drop for Display { + fn drop(&mut self) { + unsafe { wl_display_destroy(self.raw.as_ptr()) }; + } +} \ No newline at end of file