Files
ming-wm/ming-wm-lib/src/ipc.rs
stjet 724ffbd494 multi-line copy/paste, more copy/paste
fix C and D in nimbus romono
2025-04-26 05:17:06 +00:00

91 lines
2.5 KiB
Rust

use std::io::{ stdin, BufRead };
use std::panic;
use crate::window_manager_types::WindowLike;
use crate::serialize::Serializable;
use crate::themes::ThemeInfo;
use crate::framebuffer_types::Dimensions;
use crate::messages::WindowMessage;
use crate::logging::log;
/*
pub trait WindowLike {
fn handle_message(&mut self, message: WindowMessage) -> WindowMessageResponse;
fn draw(&self, theme_info: &ThemeInfo) -> Vec<DrawInstructions>;
//properties
fn title(&self) -> &'static str {
""
}
fn resizable(&self) -> bool {
false
}
fn subtype(&self) -> WindowLikeType;
fn ideal_dimensions(&self, dimensions: Dimensions) -> Dimensions; //needs &self or its not object safe or some bullcrap
}
*/
const LOG: bool = false;
/// Listen and process what the window manager writes to our stdin
pub fn listen(mut window_like: impl WindowLike) {
panic::set_hook(Box::new(|panic_info| {
let (filename, line) = panic_info.location().map(|l| (l.file(), l.line())).unwrap_or(("<unknown>", 0));
let cause = if let Some(s) = panic_info.payload().downcast_ref::<&str>() {
format!("{:?}", s)
} else if let Some(s) = panic_info.payload().downcast_ref::<String>() {
format!("{:?}", s)
} else {
"panic occurred".to_string()
};
log(&format!("A panic occurred at {}:{}: {}", filename, line, cause));
}));
let stdin = stdin();
for line in stdin.lock().lines() {
let line = line.unwrap().clone();
if LOG {
log(&line);
}
let mut parts = line.split(" ");
let method = parts.next().unwrap();
let arg = &parts.collect::<Vec<&str>>().join(" ");
let output = match method {
"handle_message" => {
//newlines allowed for ClipboardCopy, but represented by the Linear A char
window_like.handle_message(WindowMessage::deserialize(arg).unwrap()).serialize().to_string()
},
"draw" => {
//newlines never allowed
window_like.draw(&ThemeInfo::deserialize(arg).unwrap()).serialize().replace("\n", "").to_string()
},
"title" => {
window_like.title().to_string()
},
"resizable" => {
window_like.resizable().to_string()
},
"subtype" => {
window_like.subtype().serialize().to_string()
},
"ideal_dimensions" => {
window_like.ideal_dimensions(Dimensions::deserialize(arg).unwrap()).serialize().to_string()
},
_ => String::new(),
};
if output != String::new() {
if LOG {
log(&output);
}
println!("{}", output);
}
}
}