fixed various crashes by actually using an error handler!
This commit is contained in:
parent
cbbecdfe8f
commit
ef63004242
27
src/main.rs
27
src/main.rs
|
@ -11,28 +11,6 @@ mod state;
|
||||||
mod util;
|
mod util;
|
||||||
mod xlib;
|
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() {
|
fn init_logger() {
|
||||||
let encoder = Box::new(PatternEncoder::new(
|
let encoder = Box::new(PatternEncoder::new(
|
||||||
"{d(%Y-%m-%d %H:%M:%S %Z)(utc)} │ {({M}::{f}:{L}):>25} │ {h({l:>5})} │ {m}{n}",
|
"{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 home = dirs::home_dir().expect("Failed to get $HOME env var.");
|
||||||
|
|
||||||
let logfile = FileAppender::builder()
|
let _logfile = FileAppender::builder()
|
||||||
//.encoder(Box::new(PatternEncoder::default()))
|
|
||||||
.encoder(encoder)
|
.encoder(encoder)
|
||||||
.build(home.join(".local/portlights.log"))
|
.build(home.join(".local/portlights.log"))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -54,7 +31,7 @@ fn init_logger() {
|
||||||
.build(
|
.build(
|
||||||
Root::builder()
|
Root::builder()
|
||||||
.appender("stdout")
|
.appender("stdout")
|
||||||
.appender("logfile")
|
//.appender("logfile")
|
||||||
.build(log::LevelFilter::Info),
|
.build(log::LevelFilter::Info),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -408,13 +408,6 @@ impl WindowManager {
|
||||||
self.raise_floating_clients();
|
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) {
|
fn new_client(&mut self, window: Window) {
|
||||||
info!("new client: {:?}", window);
|
info!("new client: {:?}", window);
|
||||||
let client = if let Some(transient_window) = self.xlib.get_transient_for_window(window) {
|
let client = if let Some(transient_window) = self.xlib.get_transient_for_window(window) {
|
||||||
|
|
33
src/xlib.rs
33
src/xlib.rs
|
@ -5,11 +5,10 @@ use std::{ffi::CString, rc::Rc};
|
||||||
use x11::xlib::{
|
use x11::xlib::{
|
||||||
self, Atom, ButtonPressMask, ButtonReleaseMask, CWEventMask, ControlMask, CurrentTime,
|
self, Atom, ButtonPressMask, ButtonReleaseMask, CWEventMask, ControlMask, CurrentTime,
|
||||||
EnterWindowMask, FocusChangeMask, LockMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask,
|
EnterWindowMask, FocusChangeMask, LockMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask,
|
||||||
PointerMotionMask, PropertyChangeMask, ShiftMask, Status, StructureNotifyMask,
|
PointerMotionMask, PropertyChangeMask, ShiftMask, StructureNotifyMask, SubstructureNotifyMask,
|
||||||
SubstructureNotifyMask, SubstructureRedirectMask, Window, XCloseDisplay,
|
SubstructureRedirectMask, Window, XCloseDisplay, XConfigureRequestEvent, XDefaultScreen,
|
||||||
XConfigureRequestEvent, XDefaultScreen, XEvent, XGetTransientForHint, XGrabPointer,
|
XEvent, XGetTransientForHint, XGrabPointer, XInternAtom, XKillClient, XMapWindow, XOpenDisplay,
|
||||||
XInternAtom, XKillClient, XMapWindow, XOpenDisplay, XRaiseWindow, XRootWindow, XSync,
|
XRaiseWindow, XRootWindow, XSetErrorHandler, XSync, XUngrabPointer, XWarpPointer,
|
||||||
XUngrabPointer, XWarpPointer,
|
|
||||||
};
|
};
|
||||||
use xlib::GrabModeAsync;
|
use xlib::GrabModeAsync;
|
||||||
|
|
||||||
|
@ -94,6 +93,8 @@ impl XLib {
|
||||||
);
|
);
|
||||||
|
|
||||||
xlib::XSelectInput(self.dpy(), self.root, window_attributes.event_mask);
|
xlib::XSelectInput(self.dpy(), self.root, window_attributes.event_mask);
|
||||||
|
|
||||||
|
XSetErrorHandler(Some(xlib_error_handler));
|
||||||
}
|
}
|
||||||
|
|
||||||
self.grab_global_keybinds(self.root);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
4
xinitrc
4
xinitrc
|
@ -2,6 +2,6 @@
|
||||||
|
|
||||||
/usr/bin/xset b off
|
/usr/bin/xset b off
|
||||||
/usr/bin/xsetroot -solid darkslategrey
|
/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
|
export RUST_BACKTRACE=1
|
||||||
exec ./target/debug/wm >& &HOME/.portlights.log
|
exec /mnt/storage/rust/wm/target/debug/wm >& /home/user/.local/portlights.log
|
||||||
|
|
Loading…
Reference in a new issue