OFFSET偏移
← 返回作品星系

PROJECT 01 / 桌面工具

shell-switcher

先交接,
再切换。

把桌面 Shell 的停止、启动和状态确认,组织成一条有顺序的交接流程。

THE QUESTION

多个桌面 Shell 可能同时绘制面板、争用通知服务。手工停止旧服务、启动新服务时,还需要检查服务状态,不能只看命令有没有返回。

一次切换,三种路径。

源码流程示意 · 不执行系统命令
选择切换情境

成功:先交接,再记录

01停止已注册服务
02启动目标服务
03确认 active · 尝试记录

停止全部已注册服务,确认它们不再报告 active;启动目标,轮询到 active 后尝试写入选择记录。目标已独占 active 时,仅尝试更新记录。

查看这一分支

判断依据是 systemd 是否报告 active;写入选择记录和默认服务恢复都可能失败。

01 / PROBLEM

问题#

多个桌面 Shell 可能同时绘制面板、争用通知服务。手工停止旧服务、启动新服务时,还需要检查服务状态,不能只看命令有没有返回。

02 / STRUCTURE

结构#

程序读取 TOML 中的名称与 systemd 用户服务映射,通过环境变量识别会话。目标已独占 active 时仅尝试更新选择记录;否则停止全部已注册服务,确认不再报告 active,再启动目标、等待 active,最后尝试写入选择记录。boot 入口选择有效记录或默认服务并发出启动命令,不执行同一套停止和状态轮询流程。

src/main.rs · RUSTL283–L296
    // 确认真的起来了(systemd 可能还在 activating)
    let deadline = Instant::now() + START_TIMEOUT;
    loop {
        if is_active(&target_entry.service) {
            println!("{}", t!("switched", target = target));
            write_current(target);
            return ExitCode::SUCCESS;
        }
        if Instant::now() >= deadline {
            eprintln!("{}", t!("start_timeout", target = target));
            return ExitCode::from(1);
        }
        sleep(Duration::from_millis(200));
    }

命令返回后,继续确认 active;超时分支只返回错误。

03 / TRADEOFF

取舍#

把进程管理交给 systemd,Rust 程序负责启停顺序与状态判断。先停再启减少主动重叠,但会产生短暂的界面空窗。目前只识别 Hyprland 和 niri,会话检查和固定超时也构成了适用边界。

04 / RESULT

结果#

源码提供状态查询、幂等切换与按记录启动的入口。停止确认超时或启动目标的命令失败时,会尝试启动默认服务并返回错误;程序没有进一步确认恢复成功。等待目标 active 超时则直接返回错误,不执行同样的恢复步骤。

05 / SOURCE

源码与证据#

以上说明对应固定版本 1668dbdc42,不代表对所有运行环境的测试结论。

NEXT ORBIT / 下一个作品Mellow × Matugen

颜色之外,还有结构。