feat(desktop): home app (system-only launch cap, LAUNCH_BADGE: apps+launch only), pm starts it with session (relaunch <=5); display keys F1/Alt+Tab next, F2 home, F4 close app (ROLE from launcher, terminal exempt), close returns to previous window; closed window -> app exits; shell 'name &'; launch by id; pm stack 8, storage 16 clients
This commit is contained in:
@@ -259,3 +259,42 @@ fn only_the_launcher_sets_an_accent_and_it_is_in_the_theme() {
|
||||
assert_eq!(accent(&mut s, other), theme::Theme::WHIMSY_DARK.accent);
|
||||
assert_eq!(accent(&mut s, app), theme::with_accent(theme::Theme::WHIMSY_DARK, theme::Rgba::rgb(pink as u32)).accent);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn window_keys_raise_home_and_close_only_apps() {
|
||||
let key = |s: &mut Srv, k: usize| {
|
||||
s.host_mut_for_test().events = vec![[1, 10, k, 0], [2, 10, k, 0]];
|
||||
s.signal(0);
|
||||
};
|
||||
let mut s = server();
|
||||
let terminal = open(&mut s, 1, b"Terminal");
|
||||
let home = open(&mut s, 2, b"Home");
|
||||
let app = open(&mut s, 2, b"Tally");
|
||||
assert_eq!(s.handle_call(home, [w::ROLE, w::role::HOME, 0, 0], None).0[0], w::OK);
|
||||
assert_eq!(s.handle_call(app, [w::ROLE, w::role::APP, 0, 0], None).0[0], w::OK);
|
||||
assert_eq!(s.handle_call(app, [w::ROLE, w::role::HOME, 0, 0], None).0[0], MALFORMED, "once");
|
||||
s.handle_call(terminal, [w::BUFFER, 0, 0, 0], None);
|
||||
assert_eq!(s.handle_call(terminal, [w::ROLE, w::role::APP, 0, 0], None).0[0], MALFORMED, "not once it runs");
|
||||
let notify = CapSlot::new(9).unwrap();
|
||||
s.handle_call(app, [w::SUBSCRIBE, 0, 0, 0], Some(notify));
|
||||
|
||||
key(&mut s, w::HOME_KEY);
|
||||
assert_eq!(s.windows_front_for_test(), s.slot_for_test(home));
|
||||
key(&mut s, w::CLOSE_KEY);
|
||||
assert!(s.slot_for_test(home).is_some(), "Home is not closed");
|
||||
// The app in front: closed, and told.
|
||||
s.handle_call(app, [w::POLL, 0, 0, 0], None);
|
||||
key(&mut s, w::SWITCH_KEY);
|
||||
assert_eq!(s.windows_front_for_test(), s.slot_for_test(app));
|
||||
key(&mut s, w::CLOSE_KEY);
|
||||
assert_eq!(s.slot_for_test(app), None);
|
||||
assert!(s.host().signalled.contains(¬ify));
|
||||
assert_eq!(s.handle_call(app, [w::POLL, 0, 0, 0], None).0[0], MALFORMED, "its window is gone");
|
||||
// The terminal in front: kept.
|
||||
key(&mut s, w::SWITCH_KEY);
|
||||
while s.windows_front_for_test() != s.slot_for_test(terminal) {
|
||||
key(&mut s, w::SWITCH_KEY);
|
||||
}
|
||||
key(&mut s, w::CLOSE_KEY);
|
||||
assert!(s.slot_for_test(terminal).is_some());
|
||||
}
|
||||
|
||||
@@ -67,3 +67,19 @@ fn a_launchers_windows_are_found_by_its_badge() {
|
||||
let (b, _) = w.open(5, b"two").unwrap();
|
||||
assert_eq!(w.opened_by(5).collect::<Vec<_>>(), [a, b]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn closing_the_front_window_brings_back_the_one_before_it() {
|
||||
let mut w: Windows<u8> = Windows::new();
|
||||
let (t, _) = w.open(1, b"Terminal").unwrap();
|
||||
let (home, _) = w.open(2, b"Home").unwrap();
|
||||
let (app, _) = w.open(2, b"Tally").unwrap();
|
||||
assert!(w.close(app));
|
||||
assert_eq!(w.front(), Some(home), "not the next slot round");
|
||||
w.raise(t);
|
||||
let (app2, _) = w.open(2, b"Snake").unwrap();
|
||||
w.raise(home);
|
||||
w.raise(app2);
|
||||
w.close(app2);
|
||||
assert_eq!(w.front(), Some(home));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user