Skip to content

Commit 587d392

Browse files
Try to display an on-screen message if something went wrong
1 parent 762ebb7 commit 587d392

3 files changed

Lines changed: 35 additions & 4 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ input = "0.8"
1818
libc = "0.2"
1919
input-linux = { version = "0.6", features = ["serde"] }
2020
input-linux-sys = "0.8"
21-
nix = { version = "0.27", features = ["poll"] }
21+
nix = { version = "0.27", features = ["poll", "signal"] }
2222
privdrop = "0.5.3"
2323
serde = { version = "1", features = ["derive"] }
2424
toml = "0.8"

src/crash_bitmap.raw

15.7 KB
Binary file not shown.

src/main.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ use std::{
77
path::Path,
88
collections::HashMap,
99
cmp::min,
10-
mem
10+
mem,
11+
panic
1112
};
1213
use std::os::fd::AsFd;
14+
use std::panic::AssertUnwindSafe;
1315
use cairo::{ImageSurface, Format, Context, Surface, Rectangle, FontFace};
1416
use rsvg::{Loader, CairoRenderer, SvgHandle};
1517
use drm::control::ClipRect;
@@ -25,7 +27,10 @@ use input::{
2527
use libc::{O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY, c_char};
2628
use input_linux::{uinput::UInputHandle, EventKind, Key, SynchronizeKind};
2729
use input_linux_sys::{uinput_setup, input_id, timeval, input_event};
28-
use nix::poll::{poll, PollFd, PollFlags};
30+
use nix::{
31+
poll::{poll, PollFd, PollFlags},
32+
sys::signal::{Signal, SigSet}
33+
};
2934
use privdrop::PrivDrop;
3035
use serde::Deserialize;
3136
use freetype::Library as FtLibrary;
@@ -339,6 +344,33 @@ fn load_config() -> Config {
339344
}
340345

341346
fn main() {
347+
let mut drm = DrmBackend::open_card().unwrap();
348+
let _ = panic::catch_unwind(AssertUnwindSafe(|| {
349+
real_main(&mut drm)
350+
}));
351+
let crash_bitmap = include_bytes!("crash_bitmap.raw");
352+
let mut map = drm.map().unwrap();
353+
let data = map.as_mut();
354+
let mut wptr = 0;
355+
for byte in crash_bitmap {
356+
for i in 0..8 {
357+
let bit = ((byte >> i) & 0x1) == 0;
358+
let color = if bit { 0xFF } else { 0x0 };
359+
data[wptr] = color;
360+
data[wptr + 1] = color;
361+
data[wptr + 2] = color;
362+
data[wptr + 3] = color;
363+
wptr += 4;
364+
}
365+
}
366+
drop(map);
367+
drm.dirty(&[ClipRect::new(0, 0, DFR_HEIGHT as u16, DFR_WIDTH as u16)]).unwrap();
368+
let mut sigset = SigSet::empty();
369+
sigset.add(Signal::SIGTERM);
370+
sigset.wait().unwrap();
371+
}
372+
373+
fn real_main(drm: &mut DrmBackend) {
342374
let mut uinput = UInputHandle::new(OpenOptions::new().write(true).open("/dev/uinput").unwrap());
343375
let mut backlight = BacklightManager::new();
344376
let mut cfg = load_config();
@@ -356,7 +388,6 @@ fn main() {
356388
let mut surface = ImageSurface::create(Format::ARgb32, DFR_STRIDE, DFR_WIDTH).unwrap();
357389
let mut active_layer = 0;
358390
let mut needs_complete_redraw = true;
359-
let mut drm = DrmBackend::open_card().unwrap();
360391

361392
let mut input_tb = Libinput::new_with_udev(Interface);
362393
let mut input_main = Libinput::new_with_udev(Interface);

0 commit comments

Comments
 (0)