Repository navigation
[讨论稿] 把「位置 + 功能命名」落成可校验的路径式色表 —— 接着 #1434 提一份具体方案 #2220
x4w2nyhvk8
started this conversation in
Ideas | 想法
Replies: 1 comment
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
1. 为什么接着 #1434 说
主帖开篇写的背景是「主题参数命名混乱、无配套 GUI 工具、制作调试耗时、结构复杂可维护性低」,目的就是「讨论并制定下一代同文主题的设计规范」。回复里还有一句我特别有共鸣:
这几年下来,颜色字段本身也有类似问题:同一个视觉对象在不同位置有不同写法(
back_color/keyboard_back_color/keyboard_background/root_background并存);状态靠hilited_前缀表达,位置不统一;*_back_color与*_text_color对仗,但key_symbol_color、key_hint_color又不完全对仗;主题里还大量使用bc1/tc1这类自定义颜色标签,改全局颜色不生效。所以本稿只做一件事:把主帖第 10 条「
preset_color使用位置和功能的命名方式,而不是使用颜色、图像内容」落成一套有词表、有回退规则、能机器校验的路径格式。2. 一个前提:唯一事实来源是引擎源码,不是任何一份主题
现有主题里哪些颜色字段存在、哪些是同义、哪些有回退,散落在
ColorKey.kt、ThemeColors.kt、ColorTable.kt、GeneralStyle.kt里。若以某份流行主题为样本来定规范,样本没写的字段就会漏掉——我最初这么做时漏了 12 个源码字段。建议:规范色表 = 源码枚举的全集,主题只取子集,不新增规范路径。配套三条硬规则:
0xAARRGGBB或图片文件名(.png/.webp/.jpg/.gif),二者不混用值格式沿用
0xAARRGGBB并一律加引号:YAML 里#是注释符,不能用#RRGGBBAA;不加引号的0x...可能被 YAML 1.1 解析成整数。3. 路径格式:
color.<domain>[.<sub>].<part>[.<class>][.<state>]实际存储时省略
color.前缀(放在color:节点下),例如:key/preedit/candidate/popup/toolbar/clipboard/root/keyboard/smartbar。其中keyboard.background/root.background是键盘底板,不随任何按键状态变化;键帽底色是key.background,两者不同域。background/foreground/symbol/hint/outline/elevation/separator。取直白的「背景 / 前景」,与源码*_back_color/*_text_color对仗;foreground覆盖主文字与图标 tint(keyTextColor也被TabUi/PaginationUi复用),比text更准。Trime 是纯 YAML 扁平色表,没有容器层级概念,所以不引入需要额外解释的抽象容器词。default/character/system/modifier/action/space,直接对应主帖第 03、07 条要用class取代function属性和 shift 专属样式的方向。patch寻址「一截就到」,也把主帖第 04 条「按压状态自动按原状态前加前缀来取值」变成显式规则。顺序固定class → 持续态 → 瞬时态(Key.kt里两者本就正交)。on/off:YAML 1.1 会把它们解析成布尔字面量,作 token 段本身就是歧义;源码的ON_KEY_*/OFF_KEY_*统一映射到active/inactive。3.1 特异性规则:长路径优先、短路径回退
一条规则,同时解释了主帖第 04 条(缺失时读原状态)、第 05 条(
default含全部属性,其他样式可简写)和第 08 条的读取顺序。不另造第二套 fallback 机制。3.2 一处容易踩的坑:
symbol与hint不能合并源码有
KEY_SYMBOL_COLOR系列枚举,却没有KEY_HINT_COLOR(GeneralStyle.kt只有key_hint_offset_*几何字段);但 V3 主题里key_symbol_color与key_hint_color是两个字段、取值可以不同。若把二者判成同义共占一条路径,就会丢掉主题已有的信息。因此定key.symbol锚定源码枚举,key.hint归为主题自定义/补充色,四方位提示走key.hint.up/down/left/right。4. 与 #1434 各条的对应
preset_key_style/fallback_style,preset_keys、preset_keyboards移除颜色参数、增加classcolor:节点;键定义只写class+ 行为,不写颜色rows只放坐标,取色只靠class+stateclass优先使用预设名class是受控词表 6 词,路径修饰段与键的class共用同一份词表fallback_styledefault含全部属性,其他可简写default;patch只覆盖长路径fallback_colors转成路径式引用链preset_color用位置+功能命名,不用颜色名;patch class 而非 patch 颜色trime_version分派新旧读取方法trime_version: 5doc/trime-schema.json之上再加「源码锚定 + 受控词表」两层静态校验5. 键状态是矩阵,不是四份清单
源码
ColorKey.kt的键位部分本身就是一个矩阵:常态 / 按下态 /on_key_*/off_key_*及其按下态 × 背景 / 文字 / 符号 / 边框。把它整理成两根正交轴:inactive(未激活)、active(临时激活)、locked(持久锁定)pressed(按下)、longPress(长按持续中)、selected、focused、disabled于是「正常 / 按下 / 长按 / 锁定」四层不是四套独立色表,而是矩阵的单元格;「锁定态下再按下」是
…locked.pressed,叠加而非替换:backgroundkey.background…pressed…longPress…modifier.lockedforegroundkey.foreground…pressed…longPress…modifier.lockedsymbolkey.symbol…pressed…longPress…modifier.lockedhintkey.hint…pressed…longPress…modifier.lockedoutlinekey.outline…pressed…longPress…modifier.locked两点需要说明:
LONG_TEXT_*是「键面长标签」,不是长按)。它其实是触发时机(event.long_click),气泡走popup.*域,键帽是否需要独立态,见 §6.3。keyboard.background/root.background是键盘底板,属另一个域,不随键状态变化,不在这个矩阵里。6. 三处想请维护者裁决,而不是我已定稿
6.1 Shift 锁定态:主帖第 07 条 vs 第三持续态
主帖第 07 条写得很明确:
但主帖后面又提到:
而 #1908「长按 Shift 作为 CapsLock?」 到今年仍有人问。源码
ColorKey.kt只有ON_KEY_*/OFF_KEY_*两持续态,恰好对应「临时激活 / 未激活」,分不出「持久锁定」。两条路:
locked第三持续态,与active/inactive互斥、占持续态槽位(本稿暂取 b,另补 8 条status: proposed色码)。想请教:4.0 里 Caps Lock 是否仍打算只做「shift 长按模拟」? 如果是,(a) 更一致,我把
locked全部撤掉;如果打算真正实现锁定状态,(b) 是否值得现在预留一个槽位?这一条我不坚持。6.2 旧主题兼容:主帖行动 1 vs 构建期降级
主帖行动 1 是「新方法完全不对旧方法做兼容」,用
trime_version分派、4.0 去除旧方法。本稿接受trime_version作为分派键;但额外做了一层 V5 → V3 的等价降级:同一份主题能生成一份config_version: "3.0"的旧格式,供当前版本导入,便于过渡期对照验证(我这边的降级检查是 0 差异、每套 44 条路径集合一致)。这层降级是纯构建期工具行为,不要求运行时兼容。但它会不会与「完全不兼容」的路线有冲突?如果官方打算另起一套读取器,我建议把它明确定位成「迁移期工具」,不写进规范本身。
6.3
longPress与key.hint这类 proposed 状态/色码要不要留longPress(键帽长按态)、key.hint(方位提示)、key.foreground.disabled、root.foreground等共 27 条,都是源码 52 枚举之外、我认为语义必需但当前引擎没有的槽位。全部标status: proposed,并逐条写明「源码为什么缺、为什么必须补」。这类补充色码规范上应该怎么收?ColorKey.kt成为正式枚举;proposed,等 4.0 解析器一起决定。我倾向 3,但这取决于官方要不要维护一份「引擎色键全集」的公开清单。
7. 可校验性(呼应 #1294 与 #1968)
除了
doc/trime-schema.json那样的结构校验,本稿另加三层,都是纯静态、可离线跑:sha256;源码一改,校验直接报警,避免规范与实现悄悄脱节。key_domain ⊆ action_domain这类子集关系也强制检查。另配一个状态可切换的配色预览(常态 / 按下 / 长按 / 选中 / 锁定),对应主帖行动 4 的「配色调试工具」和回复里「主题 + 配色搭配后实时预览」的设想。目前这些都只是本地原型,没有向官方仓库提交任何代码。
8. 最小示例(节选,纯示意)
9. 想听的意见
preset_key_style/fallback_style是冲突,还是可以作为它们内部的取色规则?trime_version分派下,规范色表应当内置在引擎里,还是随主题分发?locked、longPress两个 proposed 状态词留不留(§6.1、§6.3)?key.hint这类「源码无枚举、但主题实际在用」的字段,规范上按补枚举 / 归别名 / 保持主题自定义 哪种收?如果第 1 条就与官方路线不符,后面几条都不必谈,我会按维护者的方向重写。
本稿基于对
develop分支源码的阅读整理,未在官方仓库提交代码或 PR;文中格式、词表与补充色码均为待讨论提案,不代表同文已实现或已采纳。All reactions