fixed various crashes by actually using an error handler!

This commit is contained in:
NoOneBtw 2021-05-01 23:24:02 +02:00
parent cbbecdfe8f
commit ef63004242
4 changed files with 32 additions and 39 deletions

View file

@ -11,28 +11,6 @@ mod state;
mod util;
mod xlib;
#[allow(dead_code)]
unsafe extern "C" fn xlib_error_handler(
_dpy: *mut x11::xlib::Display,
ee: *mut x11::xlib::XErrorEvent,
) -> std::os::raw::c_int {
let err = ee.as_ref().unwrap();
if err.error_code == x11::xlib::BadWindow
|| err.error_code == x11::xlib::BadDrawable
|| err.error_code == x11::xlib::BadAccess
|| err.error_code == x11::xlib::BadMatch
{
0
} else {
error!(
"wm: fatal error:\nrequest_code: {}\nerror_code: {}",
err.request_code, err.error_code
);
std::process::exit(1);
}
}
fn init_logger() {
let encoder = Box::new(PatternEncoder::new(
"{d(%Y-%m-%d %H:%M:%S %Z)(utc)} │ {({M}::{f}:{L}):>25} │ {h({l:>5})} │ {m}{n}",
@ -42,8 +20,7 @@ fn init_logger() {
let home = dirs::home_dir().expect("Failed to get $HOME env var.");
let logfile = FileAppender::builder()
//.encoder(Box::new(PatternEncoder::default()))
let _logfile = FileAppender::builder()
.encoder(encoder)
.build(home.join(".local/portlights.log"))
.unwrap();
@ -54,7 +31,7 @@ fn init_logger() {
.build(
Root::builder()
.appender("stdout")
.appender("logfile")
//.appender("logfile")
.build(log::LevelFilter::Info),
)
.unwrap();

View file

@ -408,13 +408,6 @@ impl WindowManager {
self.raise_floating_clients();
}
#[deprecated]
fn unfocus_client(&mut self) {
if let Some(client) = self.clients.unfocus().into_option() {
self.xlib.unfocus_client(client);
}
}
fn new_client(&mut self, window: Window) {
info!("new client: {:?}", window);
let client = if let Some(transient_window) = self.xlib.get_transient_for_window(window) {

View file

@ -5,11 +5,10 @@ use std::{ffi::CString, rc::Rc};
use x11::xlib::{
self, Atom, ButtonPressMask, ButtonReleaseMask, CWEventMask, ControlMask, CurrentTime,
EnterWindowMask, FocusChangeMask, LockMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask,
PointerMotionMask, PropertyChangeMask, ShiftMask, Status, StructureNotifyMask,
SubstructureNotifyMask, SubstructureRedirectMask, Window, XCloseDisplay,
XConfigureRequestEvent, XDefaultScreen, XEvent, XGetTransientForHint, XGrabPointer,
XInternAtom, XKillClient, XMapWindow, XOpenDisplay, XRaiseWindow, XRootWindow, XSync,
XUngrabPointer, XWarpPointer,
PointerMotionMask, PropertyChangeMask, ShiftMask, StructureNotifyMask, SubstructureNotifyMask,
SubstructureRedirectMask, Window, XCloseDisplay, XConfigureRequestEvent, XDefaultScreen,
XEvent, XGetTransientForHint, XGrabPointer, XInternAtom, XKillClient, XMapWindow, XOpenDisplay,
XRaiseWindow, XRootWindow, XSetErrorHandler, XSync, XUngrabPointer, XWarpPointer,
};
use xlib::GrabModeAsync;
@ -94,6 +93,8 @@ impl XLib {
);
xlib::XSelectInput(self.dpy(), self.root, window_attributes.event_mask);
XSetErrorHandler(Some(xlib_error_handler));
}
self.grab_global_keybinds(self.root);
@ -595,3 +596,25 @@ impl Atoms {
}
}
}
#[allow(dead_code)]
unsafe extern "C" fn xlib_error_handler(
_dpy: *mut x11::xlib::Display,
ee: *mut x11::xlib::XErrorEvent,
) -> std::os::raw::c_int {
let err = ee.as_ref().unwrap();
if err.error_code == x11::xlib::BadWindow
|| err.error_code == x11::xlib::BadDrawable
|| err.error_code == x11::xlib::BadAccess
|| err.error_code == x11::xlib::BadMatch
{
0
} else {
error!(
"wm: fatal error:\nrequest_code: {}\nerror_code: {}",
err.request_code, err.error_code
);
std::process::exit(1);
}
}

View file

@ -2,6 +2,6 @@
/usr/bin/xset b off
/usr/bin/xsetroot -solid darkslategrey
/usr/bin/feh --bg-fill "./starship.jpg"
/usr/bin/feh --bg-fill "/mnt/storage/rust/wm/starship.jpg"
export RUST_BACKTRACE=1
exec ./target/debug/wm >& &HOME/.portlights.log
exec /mnt/storage/rust/wm/target/debug/wm >& /home/user/.local/portlights.log