5 likes and I'm running this shit on my pc as-is use std::env;
use x11::xlib;
fn main() {
let dpy = unsafe { xlib::XOpenDisplay(std::ptr::null()) };
let screen = unsafe { xlib::XDefaultScreen(dpy) };
let root_window = unsafe { xlib::XRootWindow(dpy, screen) };
let image_path = env::var("IMAGE").expect("IMAGE environment variable not set");
let image = image::open(&image_path).expect("Failed to open image");
let image = image.to_rgb();
let (width, height) = image.dimensions();
let mut data = vec![0; (width * height * 3) as usize];
for (i, pixel) in image.pixels().enumerate() {
let offset = i * 3;
data[offset + 0] = pixel[0] as u8;
data[offset + 1] = pixel[1] as u8;
data[offset + 2] = pixel[2] as u8;
}
let pixmap = unsafe {
xlib::XCreatePixmap(dpy, root_window, width as u32, height as u32, 24)
};
let gc = unsafe { xlib::XCreateGC(dpy, pixmap, 0, std::ptr::null_mut()) };
unsafe {
xlib::XPutImage(
dpy,
pixmap,
gc,
&xlib::XImage {
width,
height,
xoffset: 0,
format: xlib::ZPixmap,
data: data.as_ptr() as *mut _,
byte_order: xlib::LSBFirst,
bitmap_unit: 8,
bitmap_bit_order: xlib::LSBFirst,
bitmap_pad: 8,
depth: 24,
bytes_per_line: (width * 3) as i32,
bits_per_pixel: 24,
red_mask: 0x0000FF,
green_mask: 0x00FF00,
blue_mask: 0xFF0000,
obdata: std::ptr::null_mut(),
f: std::mem::zeroed(),
},
0,
0,
0,
0,
width as i32,
height as i32,
);
xlib::XSetWindowBackgroundPixmap(dpy, root_window, pixmap);
xlib::XClearWindow(dpy, root_window);
xlib::XFreePixmap(dpy, pixmap);
xlib::XFreeGC(dpy, gc);
xlib::XCloseDisplay(dpy);
}
}
15
1