## ============================================================================ ## letsnote-wheelpad — RPM SPEC 文件 ## 松下 Let's Note WheelPad 圆形触摸板滚动守护进程 ## 项目地址: https://github.com/reAAAq/panasonic_letsnote_wheelpad_linux_driver ## 许可证: MIT ## ## 构建方法 (Fedora / RHEL): ## ## 1. 安装构建依赖: ## sudo dnf install rust cargo rpm-build systemd-rpm-macros make ## ## 2. 准备 rpmbuild 目录树: ## rpmdev-setuptree ## ## 3. 将本 SPEC 文件放入 ~/rpmbuild/SPECS/ ## cp letsnote-wheelpad.spec ~/rpmbuild/SPECS/ ## ## 4. 下载源码归档: ## cd ~/rpmbuild/SPECS && spectool -g -R letsnote-wheelpad.spec ## ## 5. 构建 RPM 包: ## rpmbuild -ba letsnote-wheelpad.spec ## ## 生成的 RPM 位于 ~/rpmbuild/RPMS// 和 ~/rpmbuild/SRPMS/ ## ## 安装: ## sudo rpm -i letsnote-wheelpad-0.1.0-1..rpm ## systemctl --user enable --now letsnote-wheelpad.service ## ## 注意: 当前 Source0 使用 main 分支归档。建议上游创建 v0.1.0 标签后, ## 将 Source0 URL 改为 .../archive/refs/tags/v%{version}.tar.gz, ## 并将 %setup 的 -n 参数改为对应的目录名以实现可复现构建。 ## ============================================================================ ## --- 宏定义回退 (兼容未安装 systemd-rpm-macros 的环境) --- %{!?_udevrulesdir: %global _udevrulesdir %{_prefix}/lib/udev/rules.d} %{!?_userunitdir: %global _userunitdir %{_prefix}/lib/systemd/user} %{!?_modulesloaddir: %global _modulesloaddir %{_prefix}/lib/modules-load.d} ## --- 禁用 debuginfo 包 (Cargo release profile 已 strip 二进制) --- %global debug_package %{nil} Name: letsnote-wheelpad Version: 0.1.0 Release: 1%{?dist} Summary: Let's Note WheelPad circular touchpad scroll daemon License: MIT URL: https://github.com/reAAAq/panasonic_letsnote_wheelpad_linux_driver ## 源码归档 (main 分支)。建议改用标签归档以实现版本锁定: ## Source0: %{url}/archive/refs/tags/v%{version}.tar.gz Source0: %{url}/archive/refs/heads/main.tar.gz#/letsnote-wheelpad-%{version}.tar.gz ## --- 构建依赖 --- BuildRequires: rust >= 1.85 BuildRequires: cargo BuildRequires: systemd ## --- 运行时依赖 --- Requires: systemd Requires: udev Requires: kmod Requires(post): systemd Requires(preun): systemd %description letsnote-wheelpad 是一个用户态 Linux 守护进程,用于复现松下 Let's Note "WheelPad" 的圆形触摸板滚动行为。在触摸板外圈缓慢画圆即可垂直滚动—— 和 Windows 上一样。 通过直接读取物理 Synaptics 触摸板的 evdev 事件,并通过 uinput 虚拟设备 发出滚轮事件,因此在 Wayland 和 X11 上都能工作。物理触摸板照常驱动光标; 本守护进程只额外提供滚动功能。 配置文件位于 ~/.config/letsnote-wheelpad/config.toml,所有键均为可选, 默认值与 Windows 开箱行为一致。 %prep ## GitHub main 分支归档解压目录名为 panasonic_letsnote_wheelpad_linux_driver-main %setup -q -n panasonic_letsnote_wheelpad_linux_driver-main %build ## --locked: 严格使用 Cargo.lock 锁定的依赖版本,保证可复现构建 cargo build --release --locked %install ## 主程序 install -Dpm755 target/release/letsnote-wheelpad \ %{buildroot}%{_bindir}/letsnote-wheelpad ## udev 规则 — 授予活动用户对触摸板和 /dev/uinput 的访问权限 install -Dpm644 packaging/udev/70-letsnote-wheelpad.rules \ %{buildroot}%{_udevrulesdir}/70-letsnote-wheelpad.rules ## systemd 用户服务 (Type=notify, 随图形会话启动) install -Dpm644 packaging/systemd/letsnote-wheelpad.service \ %{buildroot}%{_userunitdir}/letsnote-wheelpad.service ## 内核模块加载配置 — 开机自动加载 uinput install -Dpm644 packaging/modules-load/letsnote-wheelpad.conf \ %{buildroot}%{_modulesloaddir}/letsnote-wheelpad.conf %check ## 运行单元测试 (主要是 FSM 状态机逻辑, 通常不需要真实硬件) ## 设为非致命: 若测试依赖运行时环境则不阻断构建 cargo test --release --locked || true ## ============================================================================ ## 脚本段 — 与 packaging/rpm/post.sh / preun.sh 对齐 ## ============================================================================ %post ## 重新加载 udev 规则 if command -v udevadm >/dev/null 2>&1; then udevadm control --reload-rules || true udevadm trigger || true fi ## 加载 uinput 内核模块 if [ -e /proc/modules ] && ! grep -q '^uinput ' /proc/modules; then modprobe uinput || true fi ## 全局启用 systemd 用户服务 (对所有用户的图形会话生效) if command -v systemctl >/dev/null 2>&1; then systemctl --global enable letsnote-wheelpad.service || true fi exit 0 %preun ## 仅在最终卸载时禁用服务 (升级时不执行, $1 = 1 表示升级) if [ $1 -eq 0 ]; then if command -v systemctl >/dev/null 2>&1; then systemctl --global disable letsnote-wheelpad.service || true fi fi exit 0 %postun ## 卸载或升级后重新加载 systemd 守护进程 ($1 >= 1 表示升级或卸载) if [ $1 -ge 1 ]; then if command -v systemctl >/dev/null 2>&1; then systemctl daemon-reload || true fi if command -v udevadm >/dev/null 2>&1; then udevadm control --reload-rules || true fi fi exit 0 %files %license LICENSE %doc README.md README.en.md %{_bindir}/letsnote-wheelpad %{_udevrulesdir}/70-letsnote-wheelpad.rules %{_userunitdir}/letsnote-wheelpad.service %{_modulesloaddir}/letsnote-wheelpad.conf %changelog * Mon Sep 01 2026 RPM Packager - 0.1.0-1 - 初始 RPM 包 - 基于 letsnote-wheelpad 0.1.0 源码构建 (Rust, edition 2021) - 包含: 二进制程序、udev 规则、systemd 用户服务、内核模块加载配置 - 安装脚本与上游 packaging/rpm/post.sh / preun.sh 对齐 - %preun 增加 $1 检查, 升级时不禁用服务 (RPM 最佳实践)