将 Objective-C 中的 NSEvent 翻译成 Lua

我目前在尝试使用 Lua 读取一个由苹果制作的 plist 文件的内容,以便我可以将其值用于某些事情。

plist 包含键盘快捷键,使用“modifierMask”。

通过逐个测试,我已确定下面的 modifierMask 值与列出的修饰键相匹配,但我不确定苹果正在如何计算掩码值:

-- modifierMask = 131072    (shift)
-- modifierMask = 262144    (control)
-- modifierMask = 524288    (option)
-- modifierMask = 1048576   (command)
-- modifierMask = 786432    (control + option)
-- modifierMask = 393216    (control + shift)
-- modifierMask = 1310720   (control + command)
-- modifierMask = 1572864   (option + command)
-- modifierMask = 655360    (shift + option)
-- modifierMask = 1179648   (command + shift)
-- modifierMask = 917504    (control + shift + option)
-- modifierMask = 1703936   (option + command + shift)
-- modifierMask = 1835008   (control + option + command)

有人建议大多数情况下修饰符掩码与 NSEvent 修改标志 相匹配,并提供了以下 Objective-C 示例:

修改标志
以下常量(除了 NSDeviceIndependentModifierFlagsMask)表示在事件修饰符标志中找到的设备无关位:

声明
OBJECTIVE-C
enum {
   NSAlphaShiftKeyMask = 1 << 16,
   NSShiftKeyMask      = 1 << 17,
   NSControlKeyMask    = 1 << 18,
   NSAlternateKeyMask  = 1 << 19,
   NSCommandKeyMask    = 1 << 20,
   NSNumericPadKeyMask = 1 << 21,
   NSHelpKeyMask       = 1 << 22,
   NSFunctionKeyMask   = 1 << 23,
   NSDeviceIndependentModifierFlagsMask = 0xffff0000U
};

看起来很有前途,但我对 Objective-C 一无所知,所以我想知道是否有人可以帮我将这些 Objective-C 声明翻译成我可以在 Lua 中使用的东西?基本上,我想创建一个 Lua 函数,输入一个 modifierMask(即“131072”),并返回一个结果,告诉我该 modifierMask 是什么意思(即“shift”)。有什么想法吗?

提前感谢!

点赞
用户6925202
用户6925202
`maskToTable`函数将一个数值转换成对应的按键修饰符列表。

```lua
maskToTable = function(value)
    local modifiers = {
        AlphaShift = 1 << 16,
        Shift      = 1 << 17,
        Control    = 1 << 18,
        Alternate  = 1 << 19,
        Command    = 1 << 20,
        NumericPad = 1 << 21,
        Help       = 1 << 22,
        Function   = 1 << 23,
    }

    local answer = {}

    -- 遍历各个按键修饰符,若该修饰符被包含在value中,则加入answer列表中
    for k, v in pairs(modifiers) do
        if (value & v) == v then
            table.insert(answer, k)
        end
    end

    return answer
end

示例使用:

-- 关闭键盘小键盘时的Control键
hs.hotkey.bind({'ctrl'}, '', function()
    flags = hs.eventtap.checkKeyboardModifiers()
    -- 如果小键盘在使用,则忽略Control按键
    if maskToTable(flags)[1] == 'NumericPad' then return end
    -- 切换键盘小键盘
    hs.eventtap.keyStroke({'shift', 'ctrl'}, '7', 0)
end)
2016-10-05 23:30:22