Skip to content

Commit d732709

Browse files
committed
Merge branch 'background_reduce_memory_usage' into 'master'
background: Drop background image as soon as possible See merge request redox-os/orbutils!67
2 parents 18727a4 + 441fce7 commit d732709

File tree

5 files changed

+386
-285
lines changed

5 files changed

+386
-285
lines changed

‎calculator/build.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ fn main() {
88
}
99

1010
#[cfg(feature = "slint-default")]
11-
fn main() {
11+
fn main() {
1212
coop_widgets::generate_import().unwrap();
1313
slint_build::compile("ui/app.slint").unwrap();
14-
}
14+
}

‎orbutils/src/background/main.rs‎

Lines changed: 116 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1+
extern crate dirs;
2+
extern crate event;
3+
extern crate libredox;
4+
extern crate log;
15
extern crate orbclient;
26
extern crate orbimage;
37
extern 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-
};
129
use libredox::flag;
1310
use log::error;
11+
use std::{
12+
collections::HashMap,
13+
env,
14+
fs::File,
15+
os::unix::io::{AsRawFd, FromRawFd, RawFd},
16+
};
1417

1518
use orbclient::{Color, EventOption, Renderer, Window, WindowFlag};
1619
use 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
9094
fn 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!
126126
fn 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

Comments
 (0)