summaryrefslogtreecommitdiff
path: root/src/window
diff options
context:
space:
mode:
authorBen Bridle <bridle.benjamin@gmail.com>2023-10-10 14:56:04 +1300
committerBen Bridle <bridle.benjamin@gmail.com>2023-10-10 14:56:04 +1300
commita6e97019bd53e4478c846f8f636c18ecb53bece2 (patch)
tree69dada994e34cdfb4ddcef5a29c753f449407ec7 /src/window
downloadphosphor-a6e97019bd53e4478c846f8f636c18ecb53bece2.zip
First commit, before upgrading winit to version 28.1
Diffstat (limited to 'src/window')
-rw-r--r--src/window/x11.rs66
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);
+ }
+}