@@ -7,9 +7,11 @@ use std::{
77 path:: Path ,
88 collections:: HashMap ,
99 cmp:: min,
10- mem
10+ mem,
11+ panic
1112} ;
1213use std:: os:: fd:: AsFd ;
14+ use std:: panic:: AssertUnwindSafe ;
1315use cairo:: { ImageSurface , Format , Context , Surface , Rectangle , FontFace } ;
1416use rsvg:: { Loader , CairoRenderer , SvgHandle } ;
1517use drm:: control:: ClipRect ;
@@ -25,7 +27,10 @@ use input::{
2527use libc:: { O_ACCMODE , O_RDONLY , O_RDWR , O_WRONLY , c_char} ;
2628use input_linux:: { uinput:: UInputHandle , EventKind , Key , SynchronizeKind } ;
2729use 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+ } ;
2934use privdrop:: PrivDrop ;
3035use serde:: Deserialize ;
3136use freetype:: Library as FtLibrary ;
@@ -339,6 +344,33 @@ fn load_config() -> Config {
339344}
340345
341346fn 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