diff options
Diffstat (limited to 'src/window')
-rw-r--r-- | src/window/x11.rs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/window/x11.rs b/src/window/x11.rs new file mode 100644 index 0000000..d4bcbe4 --- /dev/null +++ b/src/window/x11.rs @@ -0,0 +1,66 @@ +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); + } +} |