ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Rofi 1.7.9 新特性实战指南:事件自定义命令、NVidia 渲染兼容、Smartcase 与运行时输入法控制

Rofi 1.7.9 新特性实战指南:事件自定义命令、NVidia 渲染兼容、Smartcase 与运行时输入法控制 Rofi 1.7.9 新特性实战指南事件自定义命令、NVidia 渲染兼容、Smartcase 与运行时输入法控制【免费下载链接】rofiRofi: A window switcher, application launcher and dmenu replacement项目地址: https://gitcode.com/gh_mirrors/ro/rofi本指南以 Rofi 1.7.9 官方发布说明releasenotes/1.7.9/release-1.7.9.markdown为骨架逐条拆解该版本引入的四项核心能力基于事件的自定义命令事件钩子、针对 NVidia 驱动问题的双开关、IMDKit 运行时禁用、以及 Vim 风格 Smartcase 智能大小写匹配并借助仓库源码与配套 manpage 深入剖析其底层实现。读完本文你将掌握如何为 rofi 的选中、确认、取消等事件挂接脚本如何在主题中修复 NVidia 驱动下的圆角绘制问题以及如何用-case-smart和-imdkit两个命令行参数精细控制搜索与输入法行为。1. 版本背景与定位Rofi 1.7.9 是一次以兼容性修复 交互增强为主的小版本发布紧随 1.7.8 修复边界绘制问题见 releasenotes/1.7.8/release-1.7.8.markdown之后。该版本的核心增量集中在四个方向事件驱动的自定义命令由 giomatfois62 贡献PR #2053让用户为选中变化、条目被接受、菜单取消等事件挂接任意脚本典型用途是播放音效、语音朗读。NVidia 驱动渲染 workaround 的再 workaround提供border-disable-nvidia-workaround与border-aa两个主题属性让用户针对自身显卡驱动分别关闭 workaround 或抗锯齿。IMDKit 运行时开关由 Amos Bird 贡献Issue #2124解决 IMDKit 破坏某些按键绑定如单独绑定 Super 键的问题。Vim 风格 Smartcase由 Phanium 贡献Issue #2060输入含大写字母时自动启用大小写敏感匹配否则不敏感。此外该版本还包含一批对 dmenu、DRun、scrollbar、rofi-sensible-terminal 等模块的修补详见文末 Changelog 全量清单。2. 自定义事件命令让 rofi 对交互“有反应”2.1 能力概览自 1.7.9 起rofi 允许用户在菜单发生特定事件时执行自定义命令或脚本。官方文档 doc/rofi-actions.5.markdown即 manpagerofi-actions(5)完整定义了这套机制它把 rofi 从一次性选择工具升级为可反馈交互的程序例如选中条目时播放提示音、条目被确认时朗读内容、菜单出错时弹出告警等。2.2 六个事件钩子rofi-actions(5)定义了 6 个命令行参数每个参数对应一类事件并在执行时支持占位符替换参数触发时机可用占位符-on-selection-changedcmd当前选中项发生变化{entry}-on-entry-acceptedcmd菜单条目被确认接受{entry}-on-mode-changedcmd菜单模式切换如 drun / window / ssh无-on-menu-canceledcmd菜单被取消Esc 等无-on-menu-errorcmd显示错误菜单如rofi -e error message{error}-on-screenshot-takencmdrofi 截图完成{path}在源码中这些参数与配置字段的绑定关系定义在 source/xrmoptions.con_selection_changed、on_mode_changed、on_entry_accepted、on_menu_canceled、on_screenshot_taken等均被注册为可解析的命令行/配置文件选项说明它们同时支持命令行与configuration {}配置块两种写法。2.3 实际触发调用链从源码结构看事件钩子的真正执行点分散在 rofi 的核心视图逻辑中选中变化在 source/view.c 中当config.on_selection_changed非空时通过helper_parse_setup将当前条目文本替换进{entry}占位符再调用helper_execute执行。条目接受与取消/模式切换在 source/view.c 中on_entry_accepted同样走{entry}替换而on_menu_canceled与on_mode_changed直接调用helper_execute_command执行完整命令字符串。截图完成在 source/view.c 中on_screenshot_taken使用{path}占位符接收截图文件路径。可见所有钩子最终都汇聚到 helper 层的进程执行函数说明这套机制是一个通用的命令模板执行框架占位符替换由helper_parse_setup统一完成。2.4 实战配置示例命令行方式引自rofi-actions(5)rofi -on-selection-changed /path/to/select.sh {entry} \ -on-entry-accepted /path/to/accept.sh {entry} \ -on-menu-canceled /path/to/exit.sh \ -on-mode-changed /path/to/change.sh \ -on-menu-error /path/to/error.sh {error} \ -on-screenshot-taken /path/to/camera.sh {path} \ -show drun配置文件方式写入 rofi 主题配置的configuration {}块configuration { on-selection-changed: /path/to/select.sh {entry}; on-entry-accepted: /path/to/accept.sh {entry}; on-menu-canceled: /path/to/exit.sh; on-mode-changed: /path/to/change.sh; on-menu-error: /path/to/error.sh {error}; on-screenshot-taken: /path/to/camera.sh {path}; }2.5 两个官方脚本示例播放音效选中变化时用aplay播放 wav#!/bin/bash coproc aplay -q $HOME/Music/selecting_an_item.wav官方文档特别提示必须使用coproc后台播放否则 rofi 进程会一直等待音效播放完毕才退出导致交互卡顿。朗读条目用espeak语音读出选中内容#!/bin/bash killall espeak echo selected: $ | espeak先killall espeak可以避免快速切换选中项时多个朗读进程叠加。3. NVidia 渲染兼容双开关修复圆角绘制3.1 问题由来NVidia 驱动在 cairo 的over混合算子下存在怪异行为可能导致整个屏幕变黑。1.7.8 之前 rofi 为了规避该问题引入了一个 workaround但该 workaround 反过来造成抗锯齿相关的绘制瑕疵典型表现是边框/圆角绘制异常对应 1.7.8 中的 Issue #2076。1.7.9 新增两个主题属性让用户能够针对性地再绕过这个 workaround。3.2 两个新主题属性属性默认值作用border-disable-nvidia-workaroundfalse设为true时禁用针对 NVidia 的边框绘制 workaroundborder-aatrue设为false时关闭边框抗锯齿官方推荐的全局设置方式对根选择器*生效于所有 widget* { border-disable-nvidia-workaround: true; border-aa: false; }也可以只针对单个 widget例如只修复listview的边框widget { border-disable-nvidia-workaround: true; border-aa: false; }发布说明明确建议全局设置Its recommended to set it globally以避免不同 widget 间绘制效果不一致。3.3 源码实现依据这两个属性在 source/widgets/widget.c 中于 widget 初始化时被读取border-aa映射到wid-border_antialiasingborder-disable-nvidia-workaround映射到wid-border_disable_nvidia_workaround均通过rofi_theme_get_boolean读取默认分别为TRUE与FALSE。实际的绘制分支位于 source/widgets/widget.c绘制边框前若border_antialiasing FALSE则调用cairo_set_antialias(d, CAIRO_ANTIALIAS_NONE)关闭抗锯齿若border_disable_nvidia_workaround为真则改用CAIRO_OPERATOR_ADD算子替代默认的over算子。这正是workaround 的 workaround绕开被官方修补过的绘制路径直接以 ADD 算子完成边框合成从而规避 NVidia 驱动对over算子的缺陷。1.7.9 的 Changelog 中[Widget] Add 2 workaround for error in corner radius drawing一条与此对应表明这两个开关正是为修复圆角corner radius绘制错误而引入。4. IMDKit 运行时禁用修复被破坏的按键绑定4.1 问题背景IMDKit 是 rofi 在 X11 下使用的输入法Input Method库用于支持 CJK 等复杂输入。但它可能干扰某些按键绑定——例如当你试图仅绑定Super键时事件可能被输入法过滤而失效对应 Issue #2124。此前用户只能通过编译选项关闭 IMDKit1.7.9 起可以在运行时控制。4.2 使用方式新增-imdkit命令行参数布尔开关默认开启在 source/xrmoptions.c 中注册为enable_imdkit配置项# 运行时关闭 IMDKit修复 Super 键等被输入法拦截的问题 rofi -imdkit false -show drun从 source/xcb/display.c 等处的调用看config.enable_imdkit控制着 XIM 上下文的创建、事件过滤xcb_xim_filter_event等关键路径关闭后 rofi 将完全不初始化输入法上下文按键事件直接进入正常绑定流程。注意该选项仅在 X11 后端xcb下有意义Wayland 后端使用输入法的方式不同。5. Smartcase 智能大小写匹配5.1 什么是 Smartcase借鉴 Vim 的smartcase行为Issue #2060当搜索/过滤输入中包含大写字母时自动采用大小写敏感匹配当输入全为小写时则不区分大小写。这样既保留了大写精确搜索的能力又不会因为默认大小写敏感而漏掉小写模糊匹配的结果。5.2 启用方式# 命令行启用 rofi -case-smart -show run # 配置文件 configuration { case-smart: true; }该选项在 source/xrmoptions.c 中注册默认值为FALSE见 config/config.c 的case_smart FALSE并可与既有的-case-sensitive选项source/xrmoptions.c组合使用。5.3 源码实现逻辑核心判定函数parse_case_sensitivity位于 source/helper.c先读取基础配置config.case_sensitive作为初始值若case_smart开启则默认将大小写敏感设为FALSE遍历输入字符串通过g_utf8_validateg_utf8_next_char按 Unicode 字符逐个处理一旦发现任何大写字符g_unichar_isupper就立即切换为大小写敏感。注意这里按Unicode 字符而非字节遍历意味着对包含非 ASCII 字符的多语言输入也能正确判断。实际过滤流程中source/view.c 在每次输入变化时调用parse_case_sensitivity生成过滤 token当case_smart开启且存在状态指示器时还会更新界面上的匹配状态提示source/view.c。测试覆盖见 test/helper-test.c其中分别以case_smart为FALSE/TRUE两种配置验证了大小写判定行为。6. 1.7.9 完整 Changelog 解析以下是 1.7.9 发布说明附带的完整变更清单按模块归类以便查阅核心交互与过滤添加-imdkit配置运行时切换 IMDKitIssue #2124感谢 Amos Bird。添加 Vim 风格 smartcase 支持Issue #2060感谢 Phanium。允许在匹配方法之间循环切换[View] Allow cycling through matching methodsIssue #2091。添加kb-delete-entry在 script 模式下的启用选项Issue #2087感谢 Tiou Lims。允许活动窗口排序置顶[Window] Allow active window to be sorted on topIssue #2048。dmenu 文本密码掩码修改Issue #2067感谢 Zebra2711textbox 密码掩码代码的有符号性小修复。渲染与 WidgetWidget 层为圆角绘制错误添加 2 个 workaround即border-disable-nvidia-workaround与border-aa。scrollbar 增加圆角主题化支持Issue #2108感谢 J0hannes101。新增主题选项无输入时隐藏文本光标Issue #2106感谢 J0hannes101。[XCB]不再反复进行 int→double→int 的类型转换xcb_clear_area修复参数顺序错误。DRun 与数据健壮性DRun 新增排除分类的选项Issue #2102/#2104感谢 J0hannes101。更妥善地处理损坏的 DRun 缓存文件[DRun] Better handling of corrupted cache file。终端与工具链rofi-sensible-terminal 新增 ghostty 支持Issue #2110。修复 Pango 链接问题Issue #2096感谢 Emil。[Helper]新增rofi_fallthrough宏向编译器声明 fallthrough 是有意为之。[NKUtils]放弃对 Meta 键绑定的支持Issue #2095。修复-replace的错误指针及小范围清理。修复 Pango 链接、文档头错误[Mode]。文档与其他修复 mkdocs 对子列表缩进的解释差异Issue #2112。修复fullscreen-preview.rasi中的拼写错误Issue #2113感谢 elig0n该主题文件位于 themes/fullscreen-preview.rasi。修复rofi -e之后从 stdin 读取的缓冲区溢出该修复实际随 1.7.8 发布见 releasenotes/1.7.8/release-1.7.8.markdown。值得注意的是[Lexer] Allow for optional importsIssue #2078说明主题解析器lexer/theme-lexer.l、lexer/theme-parser.y在 1.7.9 中支持了可选的import这为主题复用提供了更灵活的语法。7. 升级与验证建议升级前备份配置本版本新增的主题属性与配置项均为可选增量默认值border-aa: true、border-disable-nvidia-workaround: false、case-smart: false、imdkit开启与 1.7.8 行为保持一致普通用户升级后无需改动配置即可运行。NVidia 用户若升级后出现边框/圆角绘制异常优先按第 3 节在全局设置border-disable-nvidia-workaround: true与border-aa: false并重启 rofi 验证仅当确实遇到问题时才启用避免不必要的渲染行为改变。输入法用户若发现 Super 键等单独按键绑定失效先尝试-imdkit false定位是否为输入法过滤所致。搜索习惯用户-case-smart与既有-case-sensitive的组合可以灵活覆盖始终敏感 / 始终不敏感 / 智能判断三种过滤策略建议在run与drun模式下分别体验。如需深入了解事件钩子的完整语义请直接查阅 doc/rofi-actions.5.markdown主题属性的完整列表可参考 doc/rofi-theme.5.markdown 与默认主题 doc/default_theme.rasi命令行参数的完整注册表位于 source/xrmoptions.c。【免费下载链接】rofiRofi: A window switcher, application launcher and dmenu replacement项目地址: https://gitcode.com/gh_mirrors/ro/rofi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表