SerenityOS 鼠标设置应用(Mouse Settings)完整指南:指针速度、滚轮步长、双击速度、按钮交换、光标主题与光标高亮
【免费下载链接】serenityThe Serenity Operating System 🐞项目地址: https://gitcode.com/GitHub_Trending/se/serenity
导读
Mouse Settings 是 SerenityOS 图形桌面环境中负责鼠标与光标外观配置的系统设置应用,覆盖"指针速度、滚轮步长、双击速度、左右键交换、自然滚动、光标主题切换、光标高亮"等七大类配置项。本文以系统手册页 MouseSettings.md 为主线骨架,结合其源码实现(Userland/Applications/MouseSettings)与 WindowServer 底层服务逻辑,深入讲解每个配置项的含义、取值范围、默认值与生效机制,并给出启动方式、命令行参数与主题定制实操,帮助读者既会用界面、又看得懂原理。
一、应用概览:它是什么、能做什么
Mouse Settings(鼠标设置)是一个用于展示鼠标高级属性并提供用户配置入口的图形化设置应用。系统手册将其定位为"Mouse settings application",核心能力涵盖:
- Mouse(鼠标)标签页:指针速度、滚轮步长、双击速度、主次按键交换(为左手用户设计)以及自然滚动。
- Cursor Theme(光标主题)标签页:以下拉列表切换系统可用的默认光标主题(内置 Default 与 Dark),并支持通过
serenity-theming端口安装更多光标主题。 - Cursor Highlight(光标高亮)标签页:调整高亮颜色、不透明度与高亮半径,并提供全局快捷键 Super+H 开关高亮。
从应用注册文件 Base/res/apps/MouseSettings.af 可以看到,该应用的描述为 "Customize your mouse and cursor settings",属于Settings(设置)类别,且标记了ExcludeFromSystemMenu=true(不在系统菜单中单独展示,作为设置子项被调用),可执行文件为/bin/MouseSettings。
二、启动方式与命令行参数
手册页给出的 Synopsis 为:
$ MouseSettings应用基于 SerenityOS 的 GUI 框架(LibGUI)实现,入口位于 Userland/Applications/MouseSettings/main.cpp。从源码看,它支持一个可选的命令行参数,用于直接打开指定标签页:
$ MouseSettings --open-tab cursor-theme # 直接打开“光标主题”标签页 $ MouseSettings --open-tab cursor-highlight # 直接打开“光标高亮”标签页 $ MouseSettings --open-tab mouse # 直接打开“鼠标”标签页该参数由Core::ArgsParser解析(main.cpp),选项名为--open-tab(短选项-t),取值限定为手册页中三个标签页对应的内部标识:mouse、cursor-theme、cursor-highlight。解析后的值会通过window->set_active_tab(selected_tab)指定默认激活标签页。主窗口通过GUI::SettingsWindow::create("Mouse Settings", ...)创建,并带有一个Defaults(恢复默认值)按钮(ShowDefaultsButton::Yes)。
窗口创建流程中依次挂载三个设置页:
window->add_tab<MouseSettings::MouseWidget>("Mouse"_string, "mouse"sv); window->add_tab<MouseSettings::ThemeWidget>("Cursor Theme"_string, "cursor-theme"sv); window->add_tab<MouseSettings::HighlightWidget>("Cursor Highlight"_string, "cursor-highlight"sv);(main.cpp)
三、Mouse 标签页:指针与点击行为配置
Mouse 标签页由 MouseWidget 实现,界面布局定义在 MouseWidget.gml。它提供五项配置,所有配置在点击设置窗口的"Apply"后统一提交。
3.1 鼠标指针速度(加速度)
- 界面控件:
speed_slider(水平滑块)+speed_label。 - 取值范围:由 WindowServer 的常量限定——
mouse_accel_min = 0.5、mouse_accel_max = 3.5(见 Userland/Services/WindowServer/Screen.h)。 - 显示方式:滑块内部按
speed_slider_scale = 100.0放大为 50~350 的整数,界面标签以百分比显示({value} %),即 100% 对应加速因子 1.0。 - 底层机制:
apply_settings()中调用async_set_mouse_acceleration(factor)把滑块值除以 100 后发送给 WindowServer;WindowServer 侧ScreenInput::set_acceleration_factor()会校验factor >= mouse_accel_min && factor <= mouse_accel_max(Screen.cpp),ConnectionFromClient::set_mouse_acceleration()对越界值直接判定为客户端行为异常(did_misbehave)。该值持久化在系统配置Mouse组的AccelerationFactor键中,默认1.0(WindowServer/main.cpp)。
3.2 滚轮步长(滚动增量)
- 界面控件:
scroll_length_spinbox(SpinBox 数字输入框)。 - 取值范围:最小值为
scroll_step_size_min = 1(Screen.h),向上不限(由ConnectionFromClient::set_scroll_step_size校验step_size < scroll_step_size_min视为异常)。 - 默认值:
default_scroll_length = 4(MouseWidget.cpp)。 - 底层机制:提交时调用
async_set_scroll_step_size()更新 WindowServer 的m_scroll_step_size,用于决定滚轮滚动一格时内容滚动的行数/像素步进,直接影响浏览网页、滚动列表的节奏。
3.3 双击速度
- 界面控件:
double_click_speed_slider(水平滑块)+ 实时预览控件DoubleClickArrowWidget(上下箭头动画,见 DoubleClickArrowWidget.cpp)。 - 取值范围:WindowServer 定义
double_click_speed_min = 100、double_click_speed_max = 900(单位毫秒,见 Userland/Services/WindowServer/WindowManager.h),越小表示两次点击需越快才算双击。 - 默认值:
double_click_speed_default = 250ms(MouseWidget.cpp),WindowServer 启动时也从配置读取Input组的DoubleClickSpeed,默认 250(WindowManager.cpp)。 - 交互细节:拖动滑块时,右侧箭头控件的两个箭头间距会随速度值实时变化(
set_double_click_speed(speed)),并且该控件本身支持用鼠标点击来实际测试双击节奏——两次点击间隔小于设定速度即判定为一次成功的双击并翻转箭头颜色(DoubleClickArrowWidget::mousedown_event,见 DoubleClickArrowWidget.cpp),是一个内嵌的"双击速度自测器"。 - 底层机制:
apply_settings()调用async_set_double_click_speed();WindowServer 侧WindowManager::set_double_click_speed()校验范围后写入配置DoubleClickSpeed并落盘(WindowManager.cpp)。
3.4 主次按钮交换(左手适配)
- 界面控件:
switch_buttons_checkbox(复选框)+switch_buttons_image(示意图)。 - 默认值:关闭(
false),WindowServer 配置键为Mouse组的ButtonsSwitched(WindowManager.cpp)。 - 交互细节:勾选状态变化时,示意图会实时切换为
/res/graphics/mouse-button-right.png或/res/graphics/mouse-button-left.png,直观展示当前以哪一侧作为主键(MouseWidget.cpp)。 - 底层机制:提交时调用
async_set_mouse_buttons_switched(),WindowServer 据此交换左/右键语义,主要服务于左手使用习惯的用户。
3.5 自然滚动
- 界面控件:
natural_scroll_checkbox(复选框)。 - 默认值:关闭(
false),配置键为Mouse组的NaturalScroll(WindowManager.cpp)。 - 效果:开启后滚轮方向反转(类似 macOS 的"自然滚动"),即手指上推内容向上、下推内容向下。
3.6 恢复默认值
Mouse 标签页的"Defaults"逻辑(MouseWidget::reset_default_values)一次性将上述五项全部复位:
| 配置项 | 默认值 |
|---|---|
| 指针速度 | 100%(加速因子 1.0) |
| 滚轮步长 | 4 |
| 双击速度 | 250 ms |
| 主次按钮交换 | 关闭 |
| 自然滚动 | 关闭 |
四、Cursor Theme 标签页:光标主题切换与扩展
Cursor Theme 标签页由 ThemeWidget 实现,布局见 ThemeWidget.gml。它包含一个主题下拉框(theme_name_box,GUI::ComboBox)和一个光标预览列表(cursors_tableview,GUI::TableView,两列:位图预览 + 名称,按名称升序排序)。
4.1 主题来源与加载机制
- 主题目录:
/res/cursor-themes/,每个子目录即一个主题。 - 主题识别:
ThemeModel::invalidate()遍历该目录,仅把包含可读Config.ini的子目录列入下拉列表(ThemeWidget.cpp)。 - 光标加载:
MouseCursorModel::invalidate()遍历主题目录下所有文件,跳过.ini配置文件与文件名含2x的高分辨率(HiDPI)变体,逐个加载位图并解析热点(hotspot)参数(Gfx::CursorParams::parse_from_filename,支持如arrow.x2y2.png中的坐标编码);同时为动画光标预留了逐帧切分逻辑(1.0 / cursor.params.frames(),见 ThemeWidget.cpp)。
内置的 Default 主题位于 Base/res/cursor-themes/Default,其 Config.ini 定义了完整的鼠标形态映射表([Cursor]组),覆盖 Arrow、ResizeH/ResizeV、ResizeDTLBR/ResizeDBLTR、ResizeColumn/ResizeRow、IBeam、Disallowed、Move、Hand、Help、Drag、DragCopy、Wait(含wait.f14t100.png的帧/延时编码)、Crosshair、Eyedropper、Zoom、Hidden 等全部系统光标形态;同目录还提供*-2x.png高分辨率版本与hidden.png(1×1 透明占位,用于隐藏光标)。
4.2 主题切换与持久化
- 切换:在下拉框中选择主题后,预览列表立即刷新为该主题的所有光标,并标记设置已修改;点击 Apply 时调用
async_apply_cursor_theme(theme_name)(ThemeWidget.cpp)。 - 持久化:WindowServer 通过
ConnectionFromClient::apply_cursor_theme()调用WindowManager::apply_cursor_theme(),并把当前主题名写入配置Mouse组的CursorTheme键,默认值为"Default"(WindowManager.cpp)。 - 当前主题回读:
get_cursor_theme()直接返回配置中的CursorTheme值(ConnectionFromClient.cpp),标签页初始化时用它填充下拉框。
4.3 通过 serenity-theming 端口扩展主题
手册页明确说明:补充光标主题可通过serenity-theming端口获得,其中包含 Durrque、Chillychilly、Jakande、Vanliga、Vanliga-Dark 等社区主题(serenity-theming端口构建脚本位于 Ports/serenity-theming,同时提供系统主题定制能力)。安装这些端口包后,对应主题目录会出现在/res/cursor-themes/下,Mouse Settings 的 Cursor Theme 下拉列表即会自动识别并列出(因为列表是按目录扫描生成的),无需修改任何配置。
用户若想自制主题,只需在/res/cursor-themes/<ThemeName>/下放置一份Config.ini(仿照 Default 主题的 Config.ini 的键名映射)与对应的光标位图文件即可被系统识别。Defaults 按钮会把主题复位为"Default"(ThemeWidget.cpp)。
五、Cursor Highlight 标签页:光标高亮配置
Cursor Highlight 标签页由 HighlightWidget 实现,布局见 HighlightWidget.gml,内含一个实时预览框(HighlightPreviewWidget)、一个颜色选择器(GUI::ColorInput)和两个滑块。
5.1 三项配置参数
| 配置项 | 控件 | 默认值 | 说明 |
|---|---|---|---|
| 高亮颜色 | highlight_color_input(ColorInput) | Red(红色) | 选择高亮椭圆的基础颜色(界面选择时忽略透明度) |
| 高亮不透明度 | highlight_opacity_slider(Slider) | 110(0~255 范围) | 叠加到颜色上的 alpha 通道值 |
| 高亮半径 | highlight_radius_slider(Slider) | 25 | 可配置范围 20~60 px;小于 20 视为"不启用高亮" |
(默认值定义见 HighlightWidget.cpp)
5.2 生效机制与快捷键
- 提交时调用
async_set_cursor_highlight_radius()与async_set_cursor_highlight_color()(HighlightWidget.cpp),WindowServer 侧分别写入配置Mouse组的CursorHighlightRadius(默认 25)与CursorHighlightColor(默认红色 + alpha 110,见 WindowManager.cpp)并立即重绘光标。 - 渲染实现:Compositor 在绘制光标时,若高亮启用,则以光标热点为中心按
radius * 2的直径绘制一个抗锯齿填充椭圆(Gfx::AntiAliasingPainter::fill_ellipse),再把光标位图叠加其上(Compositor.cpp)。 - 全局开关:Super+H。
WindowManager在收到KeyDown事件且修饰键为 Super、键值为 H 时,切换m_cursor_highlight_enabled状态并让 Compositor 重绘光标(WindowManager.cpp)。 - 启用判定:
is_cursor_highlight_enabled()要求高亮半径 > 0 且开关开启(WindowManager.h)——即把半径滑到最小值以下(如 <20)等效于关闭高亮。 - 实时预览:拖动颜色/不透明度/半径任一控件,预览框
HighlightPreviewWidget都会同步更新,所见即所得(HighlightWidget.cpp)。
六、配置持久化与依赖服务一览
所有鼠标相关设置最终都会写入 WindowServer 的系统配置文件(/etc/WindowServer.ini之类由g_config指向的文件),持久化键位汇总如下:
| 配置组 | 配置键 | 默认值 | 对应界面项 |
|---|---|---|---|
| Mouse | AccelerationFactor | 1.0 | 指针速度 |
| Mouse | ScrollStepSize | —(滑块下限 1) | 滚轮步长 |
| Input | DoubleClickSpeed | 250 | 双击速度 |
| Mouse | ButtonsSwitched | false | 主次按钮交换 |
| Mouse | NaturalScroll | false | 自然滚动 |
| Mouse | CursorTheme | Default | 光标主题 |
| Mouse | CursorHighlightRadius | 25 | 光标高亮半径 |
| Mouse | CursorHighlightColor | Red(alpha 110) | 光标高亮颜色 |
(键位与默认值出处见 WindowManager.cpp)
整个应用的调用链非常清晰:Mouse Settings(LibGUI 客户端)→ IPC(GUI::ConnectionToWindowServer,接口定义于 WindowServer.ipc)→ WindowServer(ConnectionFromClient校验并转发 →WindowManager/ScreenInput落地生效并写入配置)。因此所有配置一旦应用即为全局生效,影响所有 GUI 应用的光标与点击行为,无需逐个应用单独设置。
七、小结
Mouse Settings 是 SerenityOS 中麻雀虽小、五脏俱全的输入设备设置中心:
- Mouse 标签页解决"手感"问题:速度、滚轮步长、双击速度、左右键交换与自然滚动,全部带有明确的取值范围、默认值与实时自测工具(双击箭头预览)。
- Cursor Theme 标签页解决"外观"问题:基于
/res/cursor-themes/目录 +Config.ini约定自动发现主题,内置 Default/Dark,并可通过serenity-theming端口(如 Durrque、Chillychilly、Jakande、Vanliga 等)无限扩展。 - Cursor Highlight 标签页解决"可见性"问题:颜色/不透明度/半径三项组合 + Super+H 全局开关,帮助用户在深色壁纸或高分辨率屏上快速定位光标。
对开发者而言,其源码(Userland/Applications/MouseSettings)是学习 SerenityOS 设置类应用标准写法的优秀范例:SettingsWindow+ 三个Widget各自实现initialize()/apply_settings()/reset_default_values(),再通过GUI::ConnectionToWindowServer与 WindowServer 通信,模式清晰、易于仿照扩展。
【免费下载链接】serenityThe Serenity Operating System 🐞项目地址: https://gitcode.com/GitHub_Trending/se/serenity
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考