use crate::window::GraphicsContext; use buffer::Buffer; use geometry::HasDimensions; use raw_window_handle::XlibHandle; use std::os::raw::{c_char, c_uint}; use x11_dl::xlib::{Display, Visual, Xlib, ZPixmap, GC}; pub struct X11GraphicsContext { handle: XlibHandle, lib: Xlib, gc: GC, visual: *mut Visual, depth: i32, } impl X11GraphicsContext { pub unsafe fn new(handle: XlibHandle) -> Self { let lib = match Xlib::open() { Ok(lib) => lib, Err(e) => panic!("{:?}", e), }; let screen = (lib.XDefaultScreen)(handle.display as *mut Display); let gc = (lib.XDefaultGC)(handle.display as *mut Display, screen); let visual = (lib.XDefaultVisual)(handle.display as *mut Display, screen); let depth = (lib.XDefaultDepth)(handle.display as *mut Display, screen); Self { handle, lib, gc, visual, depth } } } impl GraphicsContext for X11GraphicsContext { unsafe fn blit(&mut self, buffer: &Buffer) { let array = buffer.as_u32_slice(); let dimensions = buffer.dimensions(); //create image let image = (self.lib.XCreateImage)( self.handle.display as *mut Display, self.visual, self.depth as u32, ZPixmap, 0, (array.as_ptr()) as *mut c_char, dimensions.width as u32, dimensions.height as u32, 32, (dimensions.width * 4) as i32, ); //push image to window (self.lib.XPutImage)( self.handle.display as *mut Display, self.handle.window, self.gc, image, 0, 0, 0, 0, dimensions.width as c_uint, dimensions.height as c_uint, ); (*image).data = std::ptr::null_mut(); (self.lib.XDestroyImage)(image); } }