1+ extern crate dirs;
2+ extern crate event;
3+ extern crate libredox;
4+ extern crate log;
15extern crate orbclient;
26extern crate orbimage;
37extern crate redox_log;
4- extern crate log;
5- extern crate event;
6- extern crate libredox;
7- extern crate dirs;
88
9- use std:: {
10- collections:: HashMap , env, fs:: File , os:: unix:: io:: { AsRawFd , FromRawFd , RawFd } , rc:: Rc
11- } ;
129use libredox:: flag;
1310use log:: error;
11+ use std:: {
12+ collections:: HashMap ,
13+ env,
14+ fs:: File ,
15+ os:: unix:: io:: { AsRawFd , FromRawFd , RawFd } ,
16+ } ;
1417
1518use orbclient:: { Color , EventOption , Renderer , Window , WindowFlag } ;
1619use orbimage:: Image ;
@@ -48,14 +51,15 @@ impl BackgroundMode {
4851 }
4952}
5053
51- fn find_scale ( image : & Image , mode : BackgroundMode , display_width : u32 , display_height : u32 ) -> ( u32 , u32 ) {
54+ fn find_scale (
55+ image : & Image ,
56+ mode : BackgroundMode ,
57+ display_width : u32 ,
58+ display_height : u32 ,
59+ ) -> ( u32 , u32 ) {
5260 match mode {
53- BackgroundMode :: Center => {
54- ( image. width ( ) , image. height ( ) )
55- } ,
56- BackgroundMode :: Fill => {
57- ( display_width, display_height)
58- } ,
61+ BackgroundMode :: Center => ( image. width ( ) , image. height ( ) ) ,
62+ BackgroundMode :: Fill => ( display_width, display_height) ,
5963 BackgroundMode :: Scale => {
6064 let d_w = display_width as f64 ;
6165 let d_h = display_height as f64 ;
@@ -69,7 +73,7 @@ fn find_scale(image: &Image, mode: BackgroundMode, display_width: u32, display_h
6973 } ;
7074
7175 ( ( i_w * scale) as u32 , ( i_h * scale) as u32 )
72- } ,
76+ }
7377 BackgroundMode :: Zoom => {
7478 let d_w = display_width as f64 ;
7579 let d_h = display_height as f64 ;
@@ -90,10 +94,7 @@ fn find_scale(image: &Image, mode: BackgroundMode, display_width: u32, display_h
9094fn find_background ( ) -> String {
9195 match dirs:: home_dir ( ) {
9296 Some ( home) => {
93- for name in & [
94- "background.png" ,
95- "background.jpg" ,
96- ] {
97+ for name in & [ "background.png" , "background.jpg" ] {
9798 let path = home. join ( name) ;
9899 if path. is_file ( ) {
99100 if let Some ( path_str) = path. to_str ( ) {
@@ -118,15 +119,12 @@ fn get_full_url(path: &str) -> Result<String, String> {
118119 let count = libredox:: call:: fpath ( file. as_raw_fd ( ) as usize , & mut buf)
119120 . map_err ( |err| format ! ( "{}" , err) ) ?;
120121
121- String :: from_utf8 ( Vec :: from ( & buf[ ..count] ) )
122- . map_err ( |err| format ! ( "{}" , err) )
122+ String :: from_utf8 ( Vec :: from ( & buf[ ..count] ) ) . map_err ( |err| format ! ( "{}" , err) )
123123}
124124
125125//TODO: determine x, y of display by talking to orbital instead of guessing!
126126fn get_display_rects ( ) -> Result < Vec < DisplayRect > , String > {
127- let url = get_full_url (
128- & env:: var ( "DISPLAY" ) . or ( Err ( "DISPLAY not set" ) ) ?
129- ) ?;
127+ let url = get_full_url ( & env:: var ( "DISPLAY" ) . or ( Err ( "DISPLAY not set" ) ) ?) ?;
130128
131129 let mut url_parts = url. split ( ':' ) ;
132130 let scheme_name = url_parts. next ( ) . ok_or ( format ! ( "no scheme name" ) ) ?;
@@ -152,7 +150,8 @@ fn get_display_rects() -> Result<Vec<DisplayRect>, String> {
152150 let start_screen_i = parts. next ( ) . unwrap_or ( "" ) . parse :: < usize > ( ) . unwrap_or ( 0 ) ;
153151 //TODO: determine maximum number of screens
154152 for screen_i in start_screen_i + 1 ..1024 {
155- let url = match get_full_url ( & format ! ( "/scheme/{}/{}.{}" , scheme_name, vt_i, screen_i) ) {
153+ let url = match get_full_url ( & format ! ( "/scheme/{}/{}.{}" , scheme_name, vt_i, screen_i) )
154+ {
156155 Ok ( ok) => ok,
157156 //TODO: only check for ENOENT?
158157 Err ( _err) => break ,
@@ -192,105 +191,115 @@ fn main() {
192191 OutputBuilder :: stdout ( )
193192 . with_filter ( log:: LevelFilter :: Debug )
194193 . with_ansi_escape_codes ( )
195- . build ( )
194+ . build ( ) ,
196195 )
197196 . with_process_name ( "background" . into ( ) )
198197 . enable ( ) ;
199198
200199 let mut args = env:: args ( ) . skip ( 1 ) ;
201200
202- let path = match args. next ( ) {
201+ let path = & match args. next ( ) {
203202 Some ( arg) => arg,
204203 None => find_background ( ) ,
205204 } ;
206205
207206 let mode = BackgroundMode :: from_str ( & args. next ( ) . unwrap_or_default ( ) ) ;
208207
209- match Image :: from_path ( & path) . map ( Rc :: new) {
210- Ok ( image) => {
211- let event_queue = RawEventQueue :: new ( ) . expect ( "background: failed to create event queue" ) ;
212-
213- let mut handlers = HashMap :: < usize , Box < dyn FnMut ( ) > > :: new ( ) ;
214-
215- for display in get_display_rects ( ) . expect ( "background: failed to get display rects" ) {
216- let mut window = Window :: new_flags (
217- display. x , display. y , display. width , display. height , "" ,
218- & [ WindowFlag :: Async , WindowFlag :: Back , WindowFlag :: Borderless , WindowFlag :: Unclosable ]
219- ) . unwrap ( ) ;
220-
221- let image = image. clone ( ) ;
222- let mut scaled_image = ( * image) . clone ( ) ;
223- let mut resize = Some ( ( display. width , display. height ) ) ;
224-
225- event_queue. subscribe ( window. as_raw_fd ( ) as usize , window. as_raw_fd ( ) as usize , event:: EventFlags :: READ )
226- . expect ( "background: failed to add event" ) ;
227-
228- let window_raw_fd = window. as_raw_fd ( ) ;
229- let mut handler: Box < dyn FnMut ( ) > = Box :: new ( move || {
230- for event in window. events ( ) {
231- match event. to_option ( ) {
232- EventOption :: Resize ( resize_event) => {
233- resize = Some ( ( resize_event. width , resize_event. height ) ) ;
234- } ,
235- EventOption :: Screen ( screen_event) => {
236- window. set_size ( screen_event. width , screen_event. height ) ;
237- resize = Some ( ( screen_event. width , screen_event. height ) ) ;
238- } ,
239- _ => ( )
240- }
208+ let event_queue = RawEventQueue :: new ( ) . expect ( "background: failed to create event queue" ) ;
209+
210+ let mut handlers = HashMap :: < usize , Box < dyn FnMut ( ) > > :: new ( ) ;
211+
212+ for display in get_display_rects ( ) . expect ( "background: failed to get display rects" ) {
213+ let mut window = Window :: new_flags (
214+ display. x ,
215+ display. y ,
216+ display. width ,
217+ display. height ,
218+ "" ,
219+ & [
220+ WindowFlag :: Async ,
221+ WindowFlag :: Back ,
222+ WindowFlag :: Borderless ,
223+ WindowFlag :: Unclosable ,
224+ ] ,
225+ )
226+ . unwrap ( ) ;
227+
228+ let mut resize = Some ( ( display. width , display. height ) ) ;
229+
230+ event_queue
231+ . subscribe (
232+ window. as_raw_fd ( ) as usize ,
233+ window. as_raw_fd ( ) as usize ,
234+ event:: EventFlags :: READ ,
235+ )
236+ . expect ( "background: failed to add event" ) ;
237+
238+ let window_raw_fd = window. as_raw_fd ( ) ;
239+ let mut handler: Box < dyn FnMut ( ) > = Box :: new ( move || {
240+ for event in window. events ( ) {
241+ match event. to_option ( ) {
242+ EventOption :: Resize ( resize_event) => {
243+ resize = Some ( ( resize_event. width , resize_event. height ) ) ;
241244 }
242-
243- if let Some ( ( w, h) ) = resize. take ( ) {
244- let ( width, height) = find_scale ( & image, mode, w, h) ;
245-
246- if width == scaled_image. width ( ) && height == scaled_image. height ( ) {
247- // Do not resize scaled image
248- } else if width == image. width ( ) && height == image. height ( ) {
249- scaled_image = ( * image) . clone ( ) ;
250- } else {
251- scaled_image = image. resize ( width, height, orbimage:: ResizeType :: Lanczos3 ) . unwrap ( ) ;
252- }
253-
254- let ( crop_x, crop_w) = if width > w {
255- ( ( width - w) /2 , w)
256- } else {
257- ( 0 , width)
258- } ;
259-
260- let ( crop_y, crop_h) = if height > h {
261- ( ( height - h) /2 , h)
262- } else {
263- ( 0 , height)
264- } ;
265-
266- window. set ( Color :: rgb ( 0 , 0 , 0 ) ) ;
267-
268- let x = ( w as i32 - crop_w as i32 ) /2 ;
269- let y = ( h as i32 - crop_h as i32 ) /2 ;
270- scaled_image. roi (
271- crop_x, crop_y,
272- crop_w, crop_h,
273- ) . draw (
274- & mut window,
275- x, y
276- ) ;
277-
278- window. sync ( ) ;
245+ EventOption :: Screen ( screen_event) => {
246+ window. set_size ( screen_event. width , screen_event. height ) ;
247+ resize = Some ( ( screen_event. width , screen_event. height ) ) ;
279248 }
280- } ) ;
281- handler ( ) ;
282- handlers. insert ( window_raw_fd as usize , handler) ;
249+ _ => ( ) ,
250+ }
283251 }
284252
285- for event in event_queue. map ( |e| e. expect ( "background: failed to get next event" ) ) {
286- let Some ( handler) = handlers. get_mut ( & event. fd ) else {
287- continue ;
253+ if let Some ( ( w, h) ) = resize. take ( ) {
254+ let image = match Image :: from_path ( & path) {
255+ Ok ( image) => image,
256+ Err ( err) => {
257+ error ! ( "error loading {}: {}" , path, err) ;
258+ return ;
259+ }
260+ } ;
261+
262+ let ( width, height) = find_scale ( & image, mode, w, h) ;
263+
264+ let scaled_image = if width == image. width ( ) && height == image. height ( ) {
265+ image
266+ } else {
267+ image
268+ . resize ( width, height, orbimage:: ResizeType :: Lanczos3 )
269+ . unwrap ( )
270+ } ;
271+
272+ let ( crop_x, crop_w) = if width > w {
273+ ( ( width - w) / 2 , w)
274+ } else {
275+ ( 0 , width)
288276 } ;
289- ( * handler) ( ) ;
277+
278+ let ( crop_y, crop_h) = if height > h {
279+ ( ( height - h) / 2 , h)
280+ } else {
281+ ( 0 , height)
282+ } ;
283+
284+ window. set ( Color :: rgb ( 0 , 0 , 0 ) ) ;
285+
286+ let x = ( w as i32 - crop_w as i32 ) / 2 ;
287+ let y = ( h as i32 - crop_h as i32 ) / 2 ;
288+ scaled_image
289+ . roi ( crop_x, crop_y, crop_w, crop_h)
290+ . draw ( & mut window, x, y) ;
291+
292+ window. sync ( ) ;
290293 }
291- } ,
292- Err ( err) => {
293- error ! ( "error loading {}: {}" , path, err) ;
294- }
294+ } ) ;
295+ handler ( ) ;
296+ handlers. insert ( window_raw_fd as usize , handler) ;
297+ }
298+
299+ for event in event_queue. map ( |e| e. expect ( "background: failed to get next event" ) ) {
300+ let Some ( handler) = handlers. get_mut ( & event. fd ) else {
301+ continue ;
302+ } ;
303+ ( * handler) ( ) ;
295304 }
296305}
0 commit comments