らくがきノート

絵の練習や絵に関する備忘録を中心に、思ったことを気が向いたときに残していきます

左手デバイス(ロジクールG13)で任意のボタン押下時のみモードを切り替える

前置き

絵を描く際に左手デバイス(G13)を有効に使えてない気がしたので、設定を見直すことにしました。 ただ、指が届く範囲だとキーが足りず、手元を見ずに切替キーでモードを切り替えるのも難しいといった問題が出てきたのでいろいろと考えた結果スクリプトを使用することにしました。 f:id:yuki_taira:20170326152809p:plain:w500

やりたいこと

  • 「G22」キーが押された状態の間だけ切替キーの「M2」が押された状態にする
  • 「G21」キーが押された状態の間だけ切替キーの「M3」が押された状態にする
  • 「G21(G22)」を放すと切替キーの「M1」が押された状態にする

G13でスクリプトを使用する方法

  1. Gキーのカスタマイズを選択
  2. スクリプトを使用するプロファイルを右クリックし、スクリプトを選択 f:id:yuki_taira:20170326154814p:plain:w500
  3. 初期入力をすべて削除し、スクリプトを記入 f:id:yuki_taira:20170326155138p:plain:w500
  4. Ctrl+Sで保存し、ウインドウを閉じる

※ 以後このプロファイルでは「G21]「G22」を押すとモードが切り替わる

任意のキー押下時のみモードを切り替えるスクリプト

ネットを探してみましたが、やりたいことができるスクリプトが見つからなかったので公開しておきます。

※ 以下のスクリプトの使用する際は自己責任でお願いします。何かあっても責任は持ちません。

-- 切替キーの設定(G21,G22以外のキーで切り替える場合は変更)
SWITCH_MODE2_KEY = 22
SWITCH_MODE3_KEY = 21

MODE1 = 1
MODE2 = 2
MODE3 = 3

PRESSED_GKEY_CNT = 0
IS_SWITCH_KEY_PRESSED = false

function OnEvent( event, arg, family )
    if( family == "lhc" ) then
        PressGKeyCount( event )
        ResetMode()
        if( not IsModeSwitchingEvent( event ) ) then return end
        if( not IsModeSwitchingKeyPressed( arg ) ) then return end
        if( not IsModeSwitchableState() ) then return end
        SetMKeyState( GetMode( arg ), "lhc" )
        IS_SWITCH_KEY_PRESSED = true
    end
end

-- 押されているGキーのカウンター
function PressGKeyCount( event )
    cnt = event == "G_PRESSED" and 1 or 0
    cnt = event == "G_RELEASED" and -1 or cnt
    PRESSED_GKEY_CNT = PRESSED_GKEY_CNT + cnt
end

-- イベントがモード切替イベントかどうか
function IsModeSwitchingEvent( event )
    return event=="G_PRESSED"
end

-- 押されているキーがモード切替キーかどうか
function IsModeSwitchingKeyPressed( key )
    return key == SWITCH_MODE2_KEY or key == SWITCH_MODE3_KEY
end

-- 状態がモード切替可能状態かどうか
function IsModeSwitchableState()
    return PRESSED_GKEY_CNT == 1
end

-- 状態がモードリセット可能状態かどうか
function IsResetModeState()
    return PRESSED_GKEY_CNT == 0 and IS_SWITCH_KEY_PRESSED
end

-- 切替先のモードを取得
function GetMode( key )
    return key == SWITCH_MODE2_KEY and MODE2 or MODE3
end

-- デフォルトモード(M1)をセットしなおす
function ResetMode()
    if( not IsResetModeState() ) then return end
    SetMKeyState( MODE1, "lhc" )
    IS_SWITCH_KEY_PRESSED = false
end