Memo‎ > ‎

KeyRemap4MacBook (Version 6.4.0) に Lock 機能付き仮想モディファイアを追加する方法

KeyRemap4MacBookの作者様のページはこちら

 例として仮想モディファイア VKEY1, VKEY2, VKEY3 を追加する例を挙げます。

使用方法
  • VKEY1, VKEY2, VKEY3 はそれ自体が仮想モディファイアキーとなる
  • VKEY1_ON, VKEY2_ON, VKEY3_ON はそれぞれのモディファイアをロックする
  • VKEY1_OFF, VKEY2_OFF, VKEY3_OFF はそれぞれのモディファイアをアンロックする
  • VKEY1_TOGGLE, VKEY2_TOGGLE, VKEY3_TOGGLE は押下時にそれぞれのモディファイアのロック・アンロック状態を切り替える (CAPS-LOCK と同様の動作)

# 以下では、無用な混乱を避けるためにコードの追加場所を細かく指定していますが、その場所に書くことが必須というわけではありません。
# 本来はメタプログラミングを使った方がきれいですが、"わかりやすさを優先した"という言い訳をさせて下さい。
# パッチ? それはおいしいものですか?



src/core/kext/VirtualKey.hpp の namespace org_pqrs_KeyRemap4MacBook 内に次を追加

class Handle_VK_SWITCH_common {
public:
    Handle_VK_SWITCH_common(const KeyCode& on, const KeyCode& off, const KeyCode& toggle, const ModifierFlag& f) :
    active_(false), on_(on), off_(off), toggle_(toggle), flag_(f) {}
    bool handle(const Params_KeyboardEventCallBack& params, const KeyRemap4MacBook_bridge::GetWorkspaceData::Reply& workspacedata);
private:
    bool active_;
    const KeyCode& on_;
    const KeyCode& off_;
    const KeyCode& toggle_;
    const ModifierFlag& flag_;
};
   
class Handle_VKEY1 {
public:
    static bool handle(const Params_KeyboardEventCallBack& params, const KeyRemap4MacBook_bridge::GetWorkspaceData::Reply& workspacedata) { return h_.handle(params, workspacedata); }
private:
    static Handle_VK_SWITCH_common h_;
};
class Handle_VKEY2 {
public:
    static bool handle(const Params_KeyboardEventCallBack& params, const KeyRemap4MacBook_bridge::GetWorkspaceData::Reply& workspacedata) { return h_.handle(params, workspacedata); }
private:
    static Handle_VK_SWITCH_common h_;
};
class Handle_VKEY3 {
public:
    static bool handle(const Params_KeyboardEventCallBack& params, const KeyRemap4MacBook_bridge::GetWorkspaceData::Reply& workspacedata) { return h_.handle(params, workspacedata); }
private:
    static Handle_VK_SWITCH_common h_;
};


src/core/kext/VirtualKey.cpp の namespace org_pqrs_KeyRemap4MacBook 内に次を追加

bool
Handle_VK_SWITCH_common::handle(const Params_KeyboardEventCallBack& params, const KeyRemap4MacBook_bridge::GetWorkspaceData::Reply& workspacedata)
{
    if (params.eventType != EventType::DOWN) return false;
    if (params.key == on_){active_=true;FlagStatus::lock_increase(flag_); return true;}
    if (params.key == off_){active_=false;FlagStatus::lock_decrease(flag_); return true;}
    if (params.key == toggle_){active_=!active_;active_?FlagStatus::lock_increase(flag_):FlagStatus::lock_decrease(flag_); return true;}
    return false;
}
   
Handle_VK_SWITCH_common Handle_VKEY1::h_(KeyCode::VKEY1_ON, KeyCode::VKEY1_OFF, KeyCode::VKEY1_TOGGLE, ModifierFlag::VKEY1);
Handle_VK_SWITCH_common Handle_VKEY2::h_(KeyCode::VKEY2_ON, KeyCode::VKEY2_OFF, KeyCode::VKEY2_TOGGLE, ModifierFlag::VKEY2);
Handle_VK_SWITCH_common Handle_VKEY3::h_(KeyCode::VKEY3_ON, KeyCode::VKEY3_OFF, KeyCode::VKEY3_TOGGLE, ModifierFlag::VKEY3);

src/core/kext/util/FlagStatus.cpp の bool FlagStatus::initialize(void) 内の PUSH_ITEM(ModifierFlag::FN); と PUSH_ITEM(ModifierFlag::NONE); の間に次を追加

PUSH_ITEM(ModifierFlag::VKEY1);
PUSH_ITEM(ModifierFlag::VKEY2);
PUSH_ITEM(ModifierFlag::VKEY3);

src/core/kext/KeyCode.cpp の KeyCode ModifierFlag::getKeyCode(void) const 内の if (*this == ModifierFlag::FN) return KeyCode::FN; と return KeyCode::VK_NONE; の間に次を追加

if (*this == ModifierFlag::VKEY1) return KeyCode::VKEY1;
if (*this == ModifierFlag::VKEY2) return KeyCode::VKEY2;
if (*this == ModifierFlag::VKEY3) return KeyCode::VKEY3;

同 src/core/kext/KeyCode.cpp の ModifierFlag KeyCode::getModifierFlag(void) const 内の if (*this == KeyCode::FN) return ModifierFlag::FN; と return ModifierFlag::NONE; の間に次を追加

if (*this == KeyCode::VKEY1) return ModifierFlag::VKEY1;
if (*this == KeyCode::VKEY2) return ModifierFlag::VKEY2;
if (*this == KeyCode::VKEY3) return ModifierFlag::VKEY3;

src/core/kext/RemapUtil.cpp の void RemapUtil::fireKey(const Params_KeyboardEventCallBack& params, const KeyRemap4MacBook_bridge::GetWorkspaceData::Reply& workspacedata) 内の if (Handle_VK_LOCK_COMMAND_R::handle(p, workspacedata)) return; と if (Handle_VK_JIS_TOGGLE_EISUU_KANA::handle(p, workspacedata)) return; の間に次を追加

if (Handle_VKEY1::handle(p, workspacedata)) return;
if (Handle_VKEY2::handle(p, workspacedata)) return;
if (Handle_VKEY3::handle(p, workspacedata)) return;

src/core/kext/keycode/data/KeyCode.data の末尾に次を追加

VKEY1 --AUTO--
VKEY1_ON --AUTO--
VKEY1_OFF --AUTO--
VKEY1_TOGGLE --AUTO--
VKEY2 --AUTO--
VKEY2_ON --AUTO--
VKEY2_OFF --AUTO--
VKEY2_TOGGLE --AUTO--
VKEY3 --AUTO--
VKEY3_ON --AUTO--
VKEY3_OFF --AUTO--
VKEY3_TOGGLE --AUTO--

src/core/kext/keycode/data/ModifierFlag.data の末尾に次を追加

VKEY1 0x2000000
VKEY2 0x4000000
VKEY3 0x8000000

Comments