xkb - modifier_map 和 SetMods 之间的区别

xkb - modifier_map 和 SetMods 之间的区别

在 archlinux 上的 xkb 指南中:https://wiki.archlinux.org/index.php/X_keyboard_extension 我们看到此配置将 LWIN 设置为 ISO_Level3_Shift

   xkb_symbols { 
       key <LWIN> { [ISO_Level3_Shift ] };
       modifier_map Mod5 { ISO_Level3_Shift };
   }
   xkb_compatibility {
       interpret ISO_Level3_Shift { action= SetMods(modifiers=Mod5); };
   }

现在我有点困惑。

  • modifier_map Mod5 { ISO_Level3_Shift };ISO_Level3_Shift 是一个虚拟修饰符。所以我们需要以某种方式将其映射到真实修饰符。但是和之间有什么区别interpret ISO_Level3_Shift { action= SetMods(modifiers=Mod5); };?为什么我们需要两者?

  • 在 xkb 文件中compat/level5我看到类似

      interpret ISO_Level5_Shift+Any {
      useModMapMods= level1;
      virtualModifier= LevelFive;
      action= SetMods(modifiers=LevelFive);
      };
    
      interpret ISO_Level5_Shift {
      action= SetMods(modifiers=LevelFive);
      };
    

    useModMapMods这里的and是什么virtualModifier意思?

答案1

免责声明:我仍在尝试理解 XKB,可能存在错误。但由于目前还没有其他答案,因此以下是我目前的理解。

关于 ISO_Level3_Shift 问题的第一部分:modifier_map需要向后兼容旧的核心协议。例如,旧xmodmap程序需要它才能正常工作。并且修改映射可能仍被广泛使用,因为人们拥有 ~/.Xmodmap 文件,与 XKB 相比,这些文件易于使用且易于理解。但现代方法是使用interpret ...方法。

问题的第二部分关于 level5、useModMapMods 和 virtualModifier 对我来说比较难。可能我​​对 XKB 了解不够,无法给出简单的答案。我最好引用文档:useModMapMods= level1;意思是 LevelOneOnly。来自https://www.x.org/releases/current/doc/kbproto/xkbproto.pdf第 54 页:

levelOneOnly 设置表示,如果符号匹配其组的第一级,则相关解释应仅使用修饰符映射绑定到此键的修饰符。否则,如果所考虑的符号不在其组的移位级别一,则服务器的行为就像键的修饰符映射为空一样。请注意,如果此类解释与没有修饰符的键匹配,则它仍可能应用于移位级别一以外的符号;levelOneOnly 标志仅控制确定匹配的方式以及解释匹配时应用的键修饰符。

据我所知,这virtualModifier= LevelFive行代码再次是为了向后兼容。可以指定映射interpret任一部分或者直接在键定义中

尽管我似乎能够独立理解上述每个陈述,但我仍然无法想出一个例子来说明这些陈述的用法ISO_Level5_ShiftISO_Level5_Shift+Any解释。

相关内容