ラベル keyboard の投稿を表示しています。 すべての投稿を表示
ラベル keyboard の投稿を表示しています。 すべての投稿を表示

2020-11-25

  各所に記載されていますがWindows 10 1909で内蔵日本語キーボードと外付け英語キーボードとを併用するときの諸設定。

  まずToday's nonsense紹介されている手法を試したところ、 プランAは目的の動作をしなかった。内蔵、外付け共に日本語キーボードとして認識された。

 プランBの通り、言語設定のキーボードはPC101、内蔵キーボードは日本語キーボード、特定のHIDを英語キーボードとして

OverrideKeyboardType:4(0x00000004)

OverrideKeyboardSubtype:0(0x00000000)

 を設定したところ、目的の動作となった。


 しかしながら、1点問題がある。

  RDP接続後、接続先のOS上で内蔵キーボードが英語キーボードとして動作してしまう。例えば「Shift + 2」を打鍵すると「@」が入力される。

 よく観察すると、完全に英語キーボードとして動作している様なので、概ね以下の様な対応となっている。幸いながら日本語キーボードは英語キーボードより鍵数があるので、機能しないキーがあるものの、入力は一式可能な様である。

 

「む」→「\」

「@」→「[」

「[」→「]」

「円」→機能せず

「ろ バックスラッシュ」→機能せず 


 なお、以前使用していた環境(2016頃のLTSB)ではRDP問題がなった気がするので、1909以降で発生していると思われる。

2020-07-27

 Mac, Windowsを両方使用している環境で共通利用できるキーボード配列を検討してみる。
 無論、Mac歴の長い筆者に最適な前提とする。

 先ず、Apple標準キーボードやApple拡張キーボードの配列を再確認してみる。

 最下段を観察すると以下の配列である。

標準
[Control]
[Shift]
[Caps][Option][Command][`][SPACE][\][←][→][↓][↑]

拡張
[Caps]
[Shift]
[Control][Option/Alt][Command][SPACE][Command][Option/Alt][Control]

 Mac OSではショートカット入力で最も使用頻度が高いのは[Command]キーであり、Mac OSに慣れていると「ショートカット入力をするには、スペースバー隣接キーを押下」が標準的な動きである。

 所謂106キーボードでは以下の様な配列が多いと思う。

[Caps]
[Shift]
[Control][GUI][Alt][Space][Alt][App][Control]

 Mac OSで106キーボードを認識させた場合の標準定義は[GUI=Command][Alt=Option]となっており親指隣接キーが入れ替わった状態になる。この2種類のキーを入れ替える事でWindows用キーボードをMacに接続した場合の違和感は消える。(この入替はMac OSでも必要と考えている様でOS標準機能で入替可能)

 ここで発生するのがWindows OSも併用している場合の違和感である。Windowsでショートカット入力で最も使用頻度が高いのは[Control]であり、Mac OS操作時とWindows OS操作時でショートカット操作で押すキーの場所が異なる、という厄介な事になってしまう。(続く?)

2020-07-21

 チラシの裏です。
 iris keyboardからF13,F14を送出、Windows IMEをon/offができる様になった。
 しかし、Mac OSからRDP接続すると、上記のキーコンビネーションが利用できない。

 Mac OSでKarabiner-Elementsを設定してF13,F14をLang2,1へ割当しているので、これを一時的に解除。
 Mac OSからRDPでWindowsへ接続。
 Keymillで観測すると、F13はPrint Screen、F14は無反応であった。

 調査する(Link pdf)と、Mac OSの拡張キーボードはPrint Screen Keyは存在しない。F12の隣はF13が位置している。Windows Keyboardでは当該箇所はPrint Screenが位置している。Mac OSではiris keyboardのF13がPrint Screenとして認識されており、これがRDPを伝わってWindowsでPrint Screenとして認識されている様子。
 しかしながら、F14がScroll lockとして認識されないのは謎。

2020-07-18

 時間があったので、iris keyboardのキー配列を再考してみた。

 この手の鍵盤を使って判ったのが親指の可動範囲は想像以上に狭い事である。

 最下部に3個+1個の親指用鍵盤があるが、一番押し易い3個並んでいる中央のキーは良いが、残りは意外に押しづらいものである。

 そこで、この一番押し易いキーには何をさせるかが悩みどころである。
 色々なサイトを眺めると、IME切替「変換」「無変換」、レイヤ切替「Lower」「Raise」、入力頻度の高い「Space」「Enter」のどれか複数が陣取っている様だ。
 当初の実装は「TapでSpace、HoldでLower」「TapでEnter、HoldでLower」としていたが、IME切替がどうしても欲しくなって来た。時々強制的にIME onにするアプリが増えている気もするので。

 次に、上記の人気3種類をどの様に2個のキーに実装するかである。
 試行錯誤と妥協の結果は次の通り。

左中央「TapでSpace、HoldでLower、このキーをHoldして右中央キーを押すとIME on」
右中央「TapでEnter、HoldでLower、このキーをHoldして左中央キーを押すとIME off」

 当初はTap danceによる入力も考えたが、Tap Danceは意外に操作時間が必要と判ったので、上記の設定が一番良さそうである。

 次に、レイヤロックの配置を再検討した。
 従来は、10key、カーソルレイアは存在したが、「LowerまたはRaise + 右親指右端」の組み合わせで意外に使いづらいので、色々試してみた。

 新配置は、「Lower Hold」+「反対側Lower Double tap  or  Raise Double Tap」で特定レイヤをロックする設計とした。これにより、Adjust以外の全レイヤをロック可能とした。
 また、当方環境ではLEDが実装されていないので、レイヤロックの判別が難しく、レイヤ位置が判らなくなった時の為に「Lower Hold」+「ALT or GUI Double Tap」でロック解除する設計とした。

 実装は以下を参考にしている。

https://okapies.hateblo.jp/entry/2019/02/02/133953
http://leopardgecko.hatenablog.com/entry/2019/01/04/131410






 上記がdefault配置である。キー前面がHold時挙動。
 Shiftキーは2個あるが、変則仕様。
 右ShiftはTapでバックスラッシュ、+ 左Shiftでパイプ、HoldでShiftの複合としている。キー数が少ないので、JIS配列の真似である。
 左ShiftはTriple tapでCaps Lockとしている。
 Shiftキーは通常Tap動作が不要であり、他のキーを押下する際にHold出来れば良いので上記の設定としている。

---追加---

 右手側にCTRLが少ないので、左手側対象位置の「'」にHOLD時CTLを追加した。
 ブラウザのタブ切替でCTL+TABを頻繁に使用するので便利。




 上記がLowerレイヤである。キー右上はTap Dance操作の挙動となる。Lowerキーは2個あるので、Lowerキーに割当されている機能は反対側のLowerをHoldして指定する。
  例えば、右LowerをHoldした時に左Lowerの機能は次の通り。

Tap...F13(OS機能でIME off)
Hold...Space(余り無いが、スペースキーリピート)
Double Tap...Numpad layer lock




 上記がRaiseレイヤである。主にFunction Key入力を想定。


 余り美しく無いコードは以下。

https://github.com/7k2mpa/qmk_firmware/tree/master/keyboards/keebio/iris/keymaps/7k2mpa

2020-07-17

 何を当たり前の事を言っているんだと思われますが、qmkで嵌ったの備忘録。

 その1

 筆者はThinkPadの英語配列キーボードモデルを使用している。この機種はBIOS上でCaps LockをCTRLに置換してくれる機能がある。この機能設定ではOSからはCaps Lockは存在していないと扱われ、物理キーの押下でCaps Lock状態には出来ない。
 ここで外部キーボードとしてiris keyboardを接続するとどうなるか?
 iris keyboardのCaps Lockキーを押下してもCTRL扱いになってしまうのであった。

 筆者のqmk設定は左shift 3連続でCaps Lockコードを送出する設定だがWindowsで確認するとCTRLキー押下になっていた。
 この辺の仕組は謎であるがUSBキーボード経由の操作でもBIOSでキーコードが置換されているのだろう。


 その2

 上記の様に英語配列キーボードとなっているため、本体のキーボード上には「変換」「無変換」キーは存在しない。
 日本語IMEのon/offの明示的なon,offとして「変換」「無変換」を割当する技がある。
 ThinkPad本体に「変換」「無変換」キーが無くても、外付キーボードに「変換」「無変換」キーが存在すれば、IMEの明示的なon,offが出来るのでは?と期待したが、駄目である。
 「VK_OEM_PA1」としてOSからは認識されてしまい、このキーコードはIMEの制御用キーとして定義できない。
 よってiris keyboardでは「F13」「F14」を送出するように設定して、IME on,offを前述のキーに割当する。

2019-04-14

 久々にkeep.ioのweb siteをチェックしたらiris keyboard rev.3が発売される様子。
 従来の情報ではコントローラのオンボード化、USB-Cのコネクタ搭載が変更点であるが、

  • Option for rotary encoder at lower left corner of left half

 という記述があるのでマウスの様なロータリーエンコーダをオプションで追加できるのであろうか。
 web siteでは基盤の全体図面が載っていないので左手側の左端、というのがどこに位置しているのかは現時点で不明。
 3台も組み立ててしまったのと、送料が高いから試すかは悩ましいところ。

2019-02-14

 久々にIris Keyboardのfirmwareを探したところ、QMKのサイトに見当たらず。
 色々探したところ、forkしている様だ。

 この辺、良く判っていないので事情をご存知の方教えてください。。

2018-09-25

Keyboard Layout Editorで作って見ました。




2018-09-18

 特にキーボード自作に限らないのですが、半田ごてを最初に購入する人にはantexをお勧めする。
 15Wでは出力が小さすぎると思われる方も多いと思うのですが、antexは発熱する部分をコテ先がしっかり覆っており、熱が部品へ流れ出してもコテ先の温度低下が少ない気がします。思ったより大きな部品を半田付けできます。

 従来は30Wを使っていたのですが、比較するとコテ先の温度が変動しずらく使いやすいと感じています。

 何故かamazonで4000円以上なのですが輸入元である上記のwebでは安く販売しているので、騙されたと思って試して頂きたい。
 QMKで複雑なtap danceが使える様になったので、調子に乗って色々定義してみた。

 一見良さそうに思えたのだが、実運用に投入すると問題が判ってきた。特に連打する可能性のあるキーにtap danceを定義すると、キーの反応が鈍い様に感じられる。
 考えてみれば当然で、tap danceにならない程度早く2回打鍵すると、それがdouble tapなのか他なのかを判定したのちに2回打鍵として判定される様だ。

 例えば

tap...back space
hold...ctrl
double tap...tab

 みたな定義をすると動きがぎこちなかったり、特に意味が反対に近いキーを定義すると違和感がある。

 という訳で、当初は親指キーの内側下にも複雑なtap danceを定義したのだが、これは止める事にした。
 こんな感じでtapと長押しの組み合わせだと問題は無い。

#define KC_TBAL MT(MOD_LALT, KC_TAB) // tap TAB , Hold LALT


 また連打しないキーなら違和感が無いので積極的に使うつもりである。

 例えば以下の様な組み合わせだとleft altの連打は無いので気にならない。

tap...lalt
hold...lalt
double tap...F13
double tap&hold...app

2018-09-17

 今まではWindows OS / Mac OS双方でIMEの切り替えはキーコンビネーションのトグルで行っていた。しかしながら運用しているとIMEの強制on/offが欲しくなってきた。

 色々なサイトを眺めていると、Windowsでは「変換」「無変換」をキーコードとして送出し、IMEで当該を受け取ったらIMEをon/offすれば良い様だ。
 しかしながら、これでは上手く行かない。送出コードをF13/F14、IMEの設定を前述で切り替える様にしたら動作した。不思議なのはF23/24でも同様に設定可能であるのだが、何故か動作しない。まあ、F13以降は通常のアプリケーションでは利用しないので何でも良いのだが...。

 Mac OSではLANG1/LANG2を受信するとIME on/offと出来るのだが、安直にKarbinerを導入してF13/F14をLang1/Lang2へ設定してみた。
 細かい設定が可能なのでKarbinerはMac OSの標準装備にしても良いレベルだと思う。


7k2mpa.c


#include "7k2mpa.h"
#include "quantum.h"
#include "action.h"
#include "process_keycode/process_tap_dance.h"

/* Return an integer that corresponds to what kind of tap dance should be executed.
 *
 * How to figure out tap dance state: interrupted and pressed.
 *
 * Interrupted: If the state of a dance dance is "interrupted", that means that another key has been hit
 *  under the tapping term. This is typically indicitive that you are trying to "tap" the key.
 *
 * Pressed: Whether or not the key is still being pressed. If this value is true, that means the tapping term
 *  has ended, but the key is still being pressed down. This generally means the key is being "held".
 *
 * One thing that is currenlty not possible with qmk software in regards to tap dance is to mimic the "permissive hold"
 *  feature. In general, advanced tap dances do not work well if they are used with commonly typed letters.
 *  For example "A". Tap dances are best used on non-letter keys that are not hit while typing letters.
 *
 * Good places to put an advanced tap dance:
 *  z,q,x,j,k,v,b, any function key, home/end, comma, semi-colon
 *
 * Criteria for "good placement" of a tap dance key:
 *  Not a key that is hit frequently in a sentence
 *  Not a key that is used frequently to double tap, for example 'tab' is often double tapped in a terminal, or
 *    in a web form. So 'tab' would be a poor choice for a tap dance.
 *  Letters used in common words as a double. For example 'p' in 'pepper'. If a tap dance function existed on the
 *    letter 'p', the word 'pepper' would be quite frustating to type.
 *
 * For the third point, there does exist the 'DOUBLE_SINGLE_TAP', however this is not fully tested
 *
 */
int cur_dance (qk_tap_dance_state_t *state) {
  if (state->count == 1) {
    if (state->interrupted || !state->pressed)  return SINGLE_TAP;
    //key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'.
    else return SINGLE_HOLD;
  }
  else if (state->count == 2) {
    /*
     * DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
     * action when hitting 'pp'. Suggested use case for this return value is when you want to send two
     * keystrokes of the key, and not the 'double tap' action/macro.
    */
    if (state->interrupted) return DOUBLE_SINGLE_TAP;
    else if (state->pressed) return DOUBLE_HOLD;
    else return DOUBLE_TAP;
  }
  //Assumes no one is trying to type the same letter three times (at least not quickly).
  //If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add
  //an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP'
  if (state->count == 3) {
    if (state->interrupted || !state->pressed)  return TRIPLE_TAP;
    else return TRIPLE_HOLD;
  }
  else return 8; //magic number. At some point this method will expand to work for more presses
}

//instanalize an instance of 'tap' for the 'x' tap dance.
static tap xtap_state = {
  .is_press_action = true,
  .state = 0
};

void rthumb_finished (qk_tap_dance_state_t *state, void *user_data) {
  xtap_state.state = cur_dance(state);
  switch (xtap_state.state) {
    case SINGLE_TAP: register_code(KC_LGUI); break;
    case SINGLE_HOLD: register_code(KC_LGUI); break;
    case DOUBLE_TAP: register_code(KC_F14); break;
    case DOUBLE_HOLD: register_code(KC_LALT); break;
    case DOUBLE_SINGLE_TAP: register_code(KC_LGUI); unregister_code(KC_LGUI); register_code(KC_LGUI);
    //Last case is for fast typing. Assuming your key is `f`:
    //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
    //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
  }
}

void rthumb_reset (qk_tap_dance_state_t *state, void *user_data) {
  switch (xtap_state.state) {
    case SINGLE_TAP: unregister_code(KC_LGUI); break;
    case SINGLE_HOLD: unregister_code(KC_LGUI); break;
    case DOUBLE_TAP: unregister_code(KC_F14); break;
    case DOUBLE_HOLD: unregister_code(KC_LALT);
    case DOUBLE_SINGLE_TAP: unregister_code(KC_LGUI);
  }
  xtap_state.state = 0;
}

void lthumb_finished (qk_tap_dance_state_t *state, void *user_data) {
  xtap_state.state = cur_dance(state);
  switch (xtap_state.state) {
    case SINGLE_TAP: register_code(KC_LALT); break;
    case SINGLE_HOLD: register_code(KC_LALT); break;
    case DOUBLE_TAP: register_code(KC_F13); break;
    case DOUBLE_HOLD: register_code(KC_APP); break;
    case DOUBLE_SINGLE_TAP: register_code(KC_LALT); unregister_code(KC_LALT); register_code(KC_LALT);
  }
}

void lthumb_reset (qk_tap_dance_state_t *state, void *user_data) {
  switch (xtap_state.state) {
    case SINGLE_TAP: unregister_code(KC_LALT); break;
    case SINGLE_HOLD: unregister_code(KC_LALT); break;
    case DOUBLE_TAP: unregister_code(KC_F13); break;
    case DOUBLE_HOLD: unregister_code(KC_APP);
    case DOUBLE_SINGLE_TAP: unregister_code(KC_LALT);
  }
  xtap_state.state = 0;
}


void lithumb_finished (qk_tap_dance_state_t *state, void *user_data) {
  xtap_state.state = cur_dance(state);
  switch (xtap_state.state) {
    case SINGLE_TAP: register_code(KC_TAB); break;
    case SINGLE_HOLD: register_code(KC_LCTL); break;
    case DOUBLE_TAP: register_code(KC_TAB);unregister_code(KC_TAB);register_code(KC_TAB); break;
    case DOUBLE_HOLD: register_code(KC_RGUI); break;
    case DOUBLE_SINGLE_TAP: register_code(KC_TAB); unregister_code(KC_TAB); register_code(KC_TAB);
  }
}

void lithumb_reset (qk_tap_dance_state_t *state, void *user_data) {
  switch (xtap_state.state) {
    case SINGLE_TAP: unregister_code(KC_TAB); break;
    case SINGLE_HOLD: unregister_code(KC_LCTL); break;
    case DOUBLE_TAP: unregister_code(KC_TAB); break;
    case DOUBLE_HOLD: unregister_code(KC_RGUI);
    case DOUBLE_SINGLE_TAP: unregister_code(KC_TAB);
  }
  xtap_state.state = 0;
}


void rithumb_finished (qk_tap_dance_state_t *state, void *user_data) {
  xtap_state.state = cur_dance(state);
  switch (xtap_state.state) {
    case SINGLE_TAP: register_code(KC_BSPACE); break;
    case SINGLE_HOLD: register_code(KC_LALT); break;
    case DOUBLE_TAP: register_code(KC_BSPACE);unregister_code(KC_BSPACE);register_code(KC_BSPACE); break;
    case DOUBLE_HOLD: register_code(KC_LCTL); break;
    case DOUBLE_SINGLE_TAP: register_code(KC_BSPACE); unregister_code(KC_BSPACE); register_code(KC_BSPACE);
  }
}

void rithumb_reset (qk_tap_dance_state_t *state, void *user_data) {
  switch (xtap_state.state) {
    case SINGLE_TAP: unregister_code(KC_BSPACE); break;
    case SINGLE_HOLD: unregister_code(KC_LALT); break;
    case DOUBLE_TAP: unregister_code(KC_BSPACE); break;
    case DOUBLE_HOLD: unregister_code(KC_LCTL);
    case DOUBLE_SINGLE_TAP: unregister_code(KC_BSPACE);
  }
  xtap_state.state = 0;
}



7k2mpa.h

#pragma once

#include "quantum.h"
#include "process_keycode/process_tap_dance.h"

typedef struct {
  bool is_press_action;
  int state;
} tap;

enum {
  SINGLE_TAP = 1,
  SINGLE_HOLD = 2,
  DOUBLE_TAP = 3,
  DOUBLE_HOLD = 4,
  DOUBLE_SINGLE_TAP = 5, //send two single taps
  TRIPLE_TAP = 6,
  TRIPLE_HOLD = 7
};

//Tap dance enums
enum {
  TD_RTHUMB = 0,
  TD_LTHUMB,
  TD_RITHUMB,
  TD_LITHUMB
};

int cur_dance (qk_tap_dance_state_t *state);

//for the x tap dance. Put it here so it can be used in any keymap
void rthumb_finished (qk_tap_dance_state_t *state, void *user_data);
void rthumb_reset (qk_tap_dance_state_t *state, void *user_data);

void lthumb_finished (qk_tap_dance_state_t *state, void *user_data);
void lthumb_reset (qk_tap_dance_state_t *state, void *user_data);

void rithumb_finished (qk_tap_dance_state_t *state, void *user_data);
void rithumb_reset (qk_tap_dance_state_t *state, void *user_data);

void lithumb_finished (qk_tap_dance_state_t *state, void *user_data);
void lithumb_reset (qk_tap_dance_state_t *state, void *user_data);




keymap.c


#include "iris.h"
#include "action_layer.h"
#include "eeconfig.h"

#include "7k2mpa.h"

extern keymap_config_t keymap_config;

#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define _NUMPAD 4
#define _MOUSECURSOR 8
#define _ADJUST 16

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  NUMPAD,
  MOUSECURSOR,
  ADJUST,
};

/* Tap Dance */
enum {
//  TD_LGUIESC=0,
//  TD_LGUIAPP,
//  TD_LALTAPP,
  TD_SHIFTCAPS = 10,
  TD_LGUINMPD,
  TD_LGUIMSCS,
  TD_GRAVEESC,
  X_TAP_DANCE
};



/* Tap Dance */

#define KC_ KC_TRNS
#define _______ KC_TRNS

#define KC_LOWR LOWER
#define KC_RASE RAISE
#define KC_RST RESET
#define KC_BL_S BL_STEP
#define KC_DBUG DEBUG
#define KC_RTOG RGB_TOG
#define KC_RMOD RGB_MOD
#define KC_RHUI RGB_HUI
#define KC_RHUD RGB_HUD
#define KC_RSAI RGB_SAI
#define KC_RSAD RGB_SAD
#define KC_RVAI RGB_VAI
#define KC_RVAD RGB_VAD

#define KC_MCPW KC_POWER
#define KC_MCVU KC__VOLUP
#define KC_MCVD KC__VOLDOWN

//#define KC_BSGU MT(MOD_LGUI, KC_BSPC) // tap BackSpace , Hold RGUI
#define KC_BSAL MT(MOD_LALT, KC_BSPC) // tap BackSpace , Hold LALT
#define KC_DLAL MT(MOD_LALT, KC_DEL) // tap Delete , Hold LALT
//#define KC_GRGU MT(MOD_LGUI, KC_GRV)// tap Delete , Hold LALT

#define KC_TBAL MT(MOD_LALT, KC_TAB) // tap TAB , Hold LALT
#define KC_SLGU MT(MOD_LGUI, KC_SLSH) // tap Slash , Hold LGUI
#define KC_DOAL MT(MOD_LALT, KC_DOT) // tap Dot , Hold LALT
#define KC_COCT MT(MOD_LCTL, KC_COMM) // tap Comma , Hold LCTL
#define KC_BLRS MT(MOD_RSFT, KC_BSLS) // tap BackSlash , Hold RSFT
//#define KC_SPAT MT(MOD_LALT, KC_SPC) // tap Space , Hold LALT
#define KC_ESCT MT(MOD_LCTL, KC_ESC) // tap Escape , Hold LCTL
#define KC_TBCT MT(MOD_LCTL, KC_TAB) // tap TAB , Hold LCTL

//#define KC_CMZ LGUI(KC_Z)
//#define KC_CMX LGUI(KC_X)
//#define KC_CMC LGUI(KC_C)
//#define KC_CMV LGUI(KC_V)
#define KC_CADL ALTG(KC_DEL)
#define KC_STAB S(KC_TAB)


#define KC_SPLW LT(_LOWER,KC_SPC) // tap Space , Hold LowerLayer
#define KC_ENLW LT(_LOWER,KC_ENTER) // tap Enter , Hold LowerLayer
#define KC_ESRA LT(_RAISE,KC_ESC) // tap ESC , Hold RaiseLayer
//#define KC_TBRA LT(_RAISE,KC_TAB) // tap TAB , Hold RaiseLayer
#define KC_DLRA LT(_RAISE,KC_DEL) // tap Delete , Hold RaiseLayer
//#define KC_NPD TT(_NUMPAD) // tap Momentary NUMPAD , DualTap toggle NUMPAD
//#define KC_MSC TT(_MOUSECURSOR) // tap Momentary NUMPAD , DualTap toggle Mousecursor

/* Tap Dance */
//#define KC_LGES TD(TD_LGUIESC)
//#define KC_LGAP TD(TD_LGUIAPP)
//#define KC_LAAP TD(TD_LALTAPP)
#define KC_SHCP TD(TD_SHIFTCAPS)
#define KC_LGNP TD(TD_LGUINMPD)
#define KC_LGMC TD(TD_LGUIMSCS)
#define KC_GRES TD(TD_GRAVEESC)


#define KC_RTUB TD(TD_RTHUMB)
#define KC_LTUB TD(TD_LTHUMB)
#define KC_RITB TD(TD_RITHUMB)
#define KC_LITB TD(TD_LITHUMB)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {


  [_QWERTY] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     GRES, 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,MINS,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     TBAL, Q  , W  , E  , R  , T  ,                Y  , U  , I  , O  , P  ,EQL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     LCTL, A  , S  , D  , F  , G  ,                H  , J  , K  , L  ,SCLN,QUOT,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     SHCP, Z  , X  , C  , V  , B  ,ESRA,     DLRA, N  , M  ,COCT,DOAL,SLGU,BLRS,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                       LTUB,SPLW,LITB,         RITB,ENLW,RTUB
  //                  `----+----+----'        `----+----+----'
  ),


  [_LOWER] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     ESC ,EXLM, AT ,HASH,DLR ,PERC,               CIRC,AMPR,ASTR,LPRN,RPRN,DEL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,TILD,UNDS,PLUS,PIPE,LABK,               RABK,PGUP, UP ,PGDN,HOME,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,GRV ,MINS,EQL ,BSLS,LBRC,               RBRC,LEFT,DOWN,RGHT,END ,ENT ,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         , RO ,JYEN,QUES,LPRN,LCBR,RASE,     RASE,RCBR,RPRN,    ,    ,    ,    ,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,ESCT,         DLAL,    ,LGNP
  //                  `----+----+----'        `----+----+----'
  ),


  [_RAISE] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     F12 , F1 , F2 , F3 , F4 , F5 ,                F6 , F7 , F8 , F9 ,F10 ,F11 ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     CADL, 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,BSPC,
  //|----+----+----+----+----+----+              |----+----+----+----+----+----|
         ,EXLM, AT ,HASH,DLR ,PERC,               CIRC,AMPR,ASTR,LPRN,RPRN,ENT ,
  //|----+----+----+----+----+----|----.    ,----|----+----+----+----+----+----|
         ,PLUS,MINS,EQL ,BSLS,QUOT,    ,         ,DQUO,SLSH,    ,    ,    ,    ,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,LGMC
  //                  `----+----+----'        `----+----+----'
  ),

  [_NUMPAD] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     NLCK,    ,    ,    ,    ,    ,                   , P7 , P8 , P9 ,PMNS,DEL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,HOME,PGUP, UP ,PGDN,LABK,               RABK, P4 , P5 , P6 ,PPLS,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,END ,LEFT,DOWN,RGHT,LPRN,               RPRN, P1 , P2 , P3 ,PAST,COLN,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         ,    ,    ,    ,    ,STAB,    ,      P0 ,EQL , P0 ,COMM,DOT ,PSLS,PENT,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
  ),

  [_MOUSECURSOR] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
         ,    ,    ,    ,    ,    ,                   ,    ,    ,    ,    ,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,HOME,PGUP, UP ,PGDN,    ,               WH_D,BTN1,MS_U,BTN2,BTN3,ACL0,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,END ,LEFT,DOWN,RGHT,    ,               WH_L,MS_L,MS_D,MS_R,WH_R,ACL1,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         ,    ,    ,    ,    ,    ,    ,         ,WH_U,LEFT,DOWN, UP ,RGHT,ACL2,
  //`----+----+----+----+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
),


  [_ADJUST] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     RST ,MUTE,VOLD,VOLU,    ,    ,                   ,    ,    ,    ,    ,PSCR,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,    ,    ,    ,    ,    ,               RTOG,RMOD,RHUI,RSAI,RVAI,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     MCPW,EJCT,MCVD,MCVU,    ,    ,                   ,DBUG,RHUD,RSAD,RVAD,    ,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     MUTE,    ,VOLD,VOLU,    ,    ,    ,         ,    ,    ,    ,    ,    ,BL_S,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
  )

};


/* TAP DANCE */
void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) {
  if (state->count >= 3) {
    register_code (KC_CAPS);
  } else {
    register_code (KC_RSFT);
  }
}

void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) {
  if (state->count >= 3) {
    unregister_code (KC_CAPS);
  } else {
    unregister_code (KC_RSFT);
  }
}

void dance_lgui_numpad_finished(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        register_code(KC_LGUI);
    }
}

void dance_lgui_numpad_reset(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        unregister_code(KC_LGUI);
    }
    else
    {
        uint8_t layer = biton32(layer_state);
        if (layer == _NUMPAD)
        {
            layer_off(_NUMPAD);
        } else {
            layer_on(_NUMPAD);
            layer_off(_MOUSECURSOR);
        }
    }
}


void dance_lgui_mousecursor_finished(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        register_code(KC_LGUI);
    }
}

void dance_lgui_mousecursor_reset(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        unregister_code(KC_LGUI);
    }
    else
    {
        uint8_t layer = biton32(layer_state);
        if (layer == _MOUSECURSOR)
        {
            layer_off(_MOUSECURSOR);
        } else {
            layer_on(_MOUSECURSOR);
            layer_off(_NUMPAD);
        }
    }
}


qk_tap_dance_action_t tap_dance_actions[] = {

  // Tap once for L-GUI(Windows), twice for Escape
//        [TD_LGUIESC] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_ESC),
  // Tap once for L-GUI(Windows), twice for APP
//        [TD_LGUIAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_APP),
  // Tap once for R-Alt, twice for APP
//        [TD_LALTAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LALT, KC_APP),
    // Tap once for Left Shift , trice for CAPS Lock
        [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up),
//        [TD_SHIFTCAPS] = ACTION_TAP_DANCE_DOUBLE (KC_Z,KC_X),
        // Tap once for Left Shift , trice for CAPS Lock
        [TD_GRAVEESC] = ACTION_TAP_DANCE_DOUBLE (KC_GRAVE, KC_ESC),
  // tap once for LGUI , twice for move to NUMPAD layer
        [TD_LGUINMPD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lgui_numpad_finished, dance_lgui_numpad_reset),
  // tap once for LGUI , twice for move to MOUSECURSOR layer
        [TD_LGUIMSCS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lgui_mousecursor_finished, dance_lgui_mousecursor_reset),

        [TD_RTHUMB]     = ACTION_TAP_DANCE_FN_ADVANCED(NULL,rthumb_finished, rthumb_reset),
        [TD_LTHUMB]     = ACTION_TAP_DANCE_FN_ADVANCED(NULL,lthumb_finished, lthumb_reset),
        [TD_RITHUMB]    = ACTION_TAP_DANCE_FN_ADVANCED(NULL,rithumb_finished, rithumb_reset),
        [TD_LITHUMB]    = ACTION_TAP_DANCE_FN_ADVANCED(NULL,lithumb_finished, lithumb_reset)
};


/* END TAP DANCE */


void persistent_default_layer_set(uint16_t default_layer) {
  eeconfig_update_default_layer(default_layer);
  default_layer_set(default_layer);
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case QWERTY:
      if (record->event.pressed) {
        persistent_default_layer_set(1UL<<_qwerty break="" case="" false="" if="" lower:="" record-="" return="">event.pressed) {
        layer_on(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case RAISE:
      if (record->event.pressed) {
        layer_on(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case ADJUST:
      if (record->event.pressed) {
        layer_on(_ADJUST);
      } else {
        layer_off(_ADJUST);
      }
      return false;
      break;
  }
  return true;
}




rules.mk


RGBLIGHT_ENABLE = no
BACKLIGHT_ENABLE = no

TAP_DANCE_ENABLE=yes
SRC += 7k2mpa.c

ifndef QUANTUM_DIR
 include ../../../../Makefile
endif


2018-09-16

 順不同で進むシリーズです。
 当初、iris keyboardにキーキャップはDSA profileをつけていたのですが、happy hackingキーキャップの中央が縦に凹んでいるシリンダドリカル造形に指が慣れていることが判明しました。
 仕方がないので、OEM profileキーキャップを追加する羽目に。
 そして、親指周りのキーキャップをどうするか、という問題に突き当たりました。

 DSA profileで痛感していたのですが、親指内側の上キー(この写真で赤ESC)が押しづらく、1.5幅のキーを無理やり装着してみたりしましたが、若干しか改善されず。

 結論としては、内側の下キーをDSA、上キーをOEM R4とすると押しやすい事が判明。

 側面写真の様に背の高い上キーを押し込み状態でキー上面の高さが同じ位になるので干渉しずらくなりました。
 また親指外側のキー(この写真でALT)はOEM R1、中央のキーはDSAとしたので、どちらのキーに指が掛かっているのか判りやすくなりました。






2018-08-18

 順不同で進むシリーズです。

 Keycapの種類は色々あるが、説明は他のサイトへ譲る事にする。

 IRIS Keyboardの親指用Keycapを試したところ以下が判った。

1)両端の2個のキーは1.25Uが取り付けられる。1Uでも構わないが、1.25Uの方が押しやすい。

2)内側の上キーは1.25Uは未加工で取り付けられる。さらに1.5U、1.75UはKeycapの端の部分を丸やすりで削って逃げを作ると他のキーに干渉せずに取り付けられる。1.75Uでプレートの端と同じ幅にKeycapの端が出っ張るようになる。このキーは押しづらいためか下のキーと合わせて2Uの1キーとする作例も多いが、この加工をした長めのKeycapを取り付けると操作しやすくなるのでお勧めである。


 順不同で進むシリーズです。

 ProMicroのUSB端子がもげ易いとの噂で2点対策をしてみた。

 1点目は定番の2液式接着剤を端子の周りに盛る方式。端子の中に接着剤が入り込まないように留意が必要である。

 2点目はProMicroのソケットもどき化。Webにも検索結果が無さそうなので公開。

 この加工はスイッチを半田付けする前に行う。
 ヘッダピンを基板に半田付けするのではなく、ロープロファイルのヘッダピンソケットを取り付ける。この時点では半田はしない。ヘッダピンソケットへProMicroとヘッダピンを差し込みテープで仮止めする。


 基盤と接触している黒いものがロープロファイルのヘッダピンソケット。12pは市販されていないので14pを購入して切断して利用する。




 ProMicroの上部からピンが貫通しているが、これはProMicroに付属していたヘッダピンである。

 ヘッダピンソケットを半田付けする。
 
 ヘッダピンの樹脂部分をラジオペンチを用いてヘッダピンの端へ樹脂部分を持ち上げる。ヘッダピンの高さが不揃いになってしまうので、ピン側を下にして基板を押し付ける。ヘッダピンを十分ヘッダピンソケットの中に押し込む。



 先ずは黒い樹脂部分をラジオペンチで持ち上げる様に押し上げる。




 ヘッダピンを4隅のみ半田付けする。その後ヘッダピンをニッパで切断、さらに樹脂部分を切断する。ヘッダピンを切断すると、内側のピンが上へ持ち上がってくるので切断毎にピンを押し込むこと。


 

 上記を繰り返してヘッダピンを全て半田付けする。
  ProMicroを取り外す。片側だけを持ち上げるとヘッダピンが曲がってしまうので片側を僅かに持ち上げる。多分に持ち上がった瞬間に「ぺきっ」という音と共に僅かにヘッダピンソケットとの間隔が開いている筈である。
ProMicroを取り外した後、スイッチを半田付けする。

2018-08-17

 順不同で進むシリーズです。

 ASCIIの記事を見て作りたくなったIRIS Keyboardですが、先ずはKeebioでPCBを調達。$17.99と安価なので予備を考慮して3セット発注。


Iris Keyboard - PCBs for Split Ergonomic Keyboard × 3
White PCB Kit

Subtotal
    $53.97

Shipping
    $24.22

Total
    $78.19 USD

 小物なのに送料が意外に高価。基板に加えてTRRSコネクタ、リセットスイッチ、ダイオードが付属する。抵抗が付属するとあるが言わないと付属しないようです。LEDを使わない場合は抵抗不要。
 注文後配送に2週間程必要。


 次にスイッチを取り付けるプレートを検討した。PCB発注時にはkeebioでステンレスプレートは売り切れだったが、暫くしたら入荷していたので3セット発注。国内でステンレス加工の見積を取ってみたが高価だったのでkeebioからとした。ASCIIの記事では「仕上げは良くない」と書かれていたが、そのとおりで表面に若干の傷が付いた仕上げになっていた。見た目は梨目の様である。
(追記)
 良く見たらステンレスプレートはB-Stockであり、小傷ありの在庫品扱いである。この様な傷はあっても正常ということ。


Iris Keyboard - Case/Plates × 3
(B-stock) Stainless Steel Plates

Subtotal
    $107.97

Shipping
    $53.11

Total
    $161.08 USD

 こちらも送料が高価。送料込みで表裏1枚2セットで6000円程になる。国内でステンレス加工すると2万円以上なのでステンレスパネルが良ければkeebio購入が現実的な選択だろう。こちらは注文後1週間程度と重量があるのに早く到着した。スペーサーとネジのセットが付属する。
 ところで荷物を確認したところネジのセットが半分しか入っていなかった。mailしたところbug trackシステムへ登録され、2日程で連絡があり不足分が発送された。こちらは到着まで10日程必要であった。


 現在使用しているCherry茶軸キーボードのクローンとなるGateron茶軸を調達。56個で1セット完成するので110個入りとした。
 Keycapは取り敢えずDSA profileとした。1Uキーが多数あれば良いので色の良さそうなセットを適当に選択。blankでキー数が多いものにしたが、1.25Uと1.5Uのキーが数個あると便利なので結果的には正解であった。

Store: Cool Jazz Store

Gateron mx switch 3 pin adn 5 pin transparent case mx green brown blue switches for mechanical keyboard cherry mx compatible
Color: 3 pin 110 pcs
Axis Body: Gateron mx Brown
(sail chen)
    ¥ 3,330     1 Pack     ¥ 3,330     Confirmation Timeout Open Dispute   

AliExpress Standard Shipping

Free Shipping

Estimated Delivery Time:13-20 Days
Cool Jazz 121/152 DSA keycap dolch white and grey pbt blank keycaps for wried mechanical gaming keyboard
Color: white and blue
Axis Body: 121 keys
(sail chen)
    ¥ 3,533     1 Set     ¥ 3,533     Confirmation Timeout Open Dispute   

AliExpress Standard Shipping

Free Shipping

Estimated Delivery Time:13-20 Days
Product Amount     Shipping Cost     Total Amount
JPY ¥ 6,862
  
JPY ¥ 0
  
JPY ¥ 6,637

 送料無料で到着まで2週間程度。



 ProMicroコントローラはkeebioで購入しても良かったがAliexpressで1個398円なのでそちらで。諸所の情報ではUSBコネクタがもげてしまうとあったので、予備を2個追加。


Store: XM (ShenZhen) Electronic Trade Co.,Ltd

1pcs With the bootloader New version Pro Micro ATmega32U4 ATMEGA32U4-AU 5V/16MHz Module controller (hei)
(Dennis lau)
    ¥ 398     8 pieces     ¥ 3,184     Confirmation Timeout Open Dispute   

China Post Registered Air Mail

Estimated Delivery Time:13-21 Days

Processing Time:7 Days
Product Amount     Shipping Cost     Total Amount
JPY ¥ 3,177
  
JPY ¥ 238
  
JPY ¥ 3,415

 送料無料で到着まで2週間程度。



 2,3台目を作成する際に以下を追加。茶軸の感触は良いのだが、親指用にもう少し重めの黒軸を調達してみた。
 キートップはblankも良いが使いづらいのでTOP printのものを追加してみた。

Store: Cool Jazz Store


Gateron mx switch 3 pin adn 5 pin transparent case mx green brown blue switches for mechanical keyboard cherry mx compatible
Color: 3 pin 65 pcs
Axis Body: Gateron mx Brown
(sail chen)
    ¥ 2,239     1 Pack     ¥ 2,239     Confirmation Received Open Dispute   

AliExpress Standard Shipping

Free Shipping

Estimated Delivery Time:13-20 Days
Free Shipping Mechanical keyboard cherry clone gateron mx switch transparent case mx brown blue red switch lighting translucent
Color: 3 pin 12 pcs
Axis Body: Gateron mx Black
(sail chen)
    ¥ 811     1 Pack     ¥ 811     Confirmation Received Open Dispute   

AliExpress Standard Shipping

Free Shipping

Estimated Delivery Time:13-20 Days
top printed dsa pbt keycap for mechanical keyboard 108 keys iso keys full set dolch keycaps color corsair keycap filco minila
Color: blue and white
Axis Body: 87 add iso keys
(sail chen)
    ¥ 3,736     1 Set     ¥ 3,736     Confirmation Received Open Dispute   

AliExpress Standard Shipping

Free Shipping

Estimated Delivery Time:13-20 Days
Product Amount     Shipping Cost     Total Amount
JPY ¥ 6,783
  
JPY ¥ 0
  
JPY ¥ 6,447




 それ以外の小物は以下。

 TRRSケーブルMicro USB変換ケーブル短めのUSBケーブルを千石電商で調達。
 ProMicroのUSBコネクタもげ対策にソケット化もどき用にヘッダピンソケット、絶縁用にポリイミドテープを秋月電子で調達。
 ProMicroのUSBコネクタもげ対策で接着剤をヨドバシカメラで調達。
 後述のProMicroソケット化もどきをするとスペーサーの高さが若干不足するので調整用にM2のスプリングワッシャをネジの西川で調達。100枚入りで120円。


-----

 DSAプロファイルのキートップは手に馴染まなかったので、以下のOEMプロファイルのキーキャップを2セット追加。
 他にProMicroがもげたので再度発注...。

Store: Shenzhen YMD Tech Co.,LTD Store


YMDK 96 84 ANSI ISO Keyset OEM Profile Thick PBT Keycap set For Cherry MX Mechanical Keyboard YMD96 RS96 YMD75 KBD75 FC980M
Color:   Gray Beige
(Vincent Zhao)
¥ 2,699 1 piece ¥ 2,699 Confirmation Received Open Dispute
HongKong Post Air Mail
Free Shipping
Estimated Delivery Time:12-19 Days
Processing Time:5 Days
Product Amount Shipping Cost Total Amount
JPY ¥ 2,698
JPY ¥ 0
JPY ¥ 2,699

2018-08-15



#include "iris.h"
#include "action_layer.h"
#include "eeconfig.h"

extern keymap_config_t keymap_config;

#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define _NUMPAD 4
#define _MOUSECURSOR 8
#define _ADJUST 16

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  NUMPAD,
  MOUSECURSOR,
  ADJUST,
};

/* Tap Dance */
enum {
  TD_LGUIESC=0,
  TD_LGUIAPP,
  TD_LALTAPP,
  TD_SHIFTCAPS,
  TD_LGUINMPD,
  TD_LGUIMSCS
};


#define KC_ KC_TRNS
#define _______ KC_TRNS

#define KC_LOWR LOWER
#define KC_RASE RAISE
#define KC_RST RESET
#define KC_BL_S BL_STEP
#define KC_DBUG DEBUG
#define KC_RTOG RGB_TOG
#define KC_RMOD RGB_MOD
#define KC_RHUI RGB_HUI
#define KC_RHUD RGB_HUD
#define KC_RSAI RGB_SAI
#define KC_RSAD RGB_SAD
#define KC_RVAI RGB_VAI
#define KC_RVAD RGB_VAD
#define KC_MCPW KC_POWER
#define KC_MCVU KC__VOLUP
#define KC_MCVD KC__VOLDOWN

//#define KC_BSGU MT(MOD_LGUI, KC_BSPC) // tap BackSpace , Hold RGUI
#define KC_BSAL MT(MOD_LALT, KC_BSPC) // tap BackSpace , Hold LALT
#define KC_DLAL MT(MOD_LALT, KC_DEL) // tap Delete , Hold LALT

#define KC_TBAL MT(MOD_LALT, KC_TAB) // tap TAB , Hold LALT
#define KC_SLGU MT(MOD_LGUI, KC_SLSH) // tap Slash , Hold LGUI
#define KC_DOAL MT(MOD_LALT, KC_DOT) // tap Dot , Hold LALT
#define KC_COCT MT(MOD_LCTL, KC_COMM) // tap Comma , Hold LCTL
#define KC_BLRS MT(MOD_RSFT, KC_BSLS) // tap BackSlash , Hold RSFT
//#define KC_SPAT MT(MOD_LALT, KC_SPC) // tap Space , Hold LALT
#define KC_ESCT MT(MOD_LCTL, KC_ESC) // tap Escape , Hold LCTL
#define KC_TBCT MT(MOD_LCTL, KC_TAB) // tap TAB , Hold LCTL

//#define KC_CMZ LGUI(KC_Z)
//#define KC_CMX LGUI(KC_X)
//#define KC_CMC LGUI(KC_C)
//#define KC_CMV LGUI(KC_V)
#define KC_CADL ALTG(KC_DEL)
#define KC_STAB S(KC_TAB)


#define KC_SPLW LT(_LOWER,KC_SPC) // tap Space , Hold LowerLayer
#define KC_ENLW LT(_LOWER,KC_ENTER) // tap Enter , Hold LowerLayer
#define KC_ESRA LT(_RAISE,KC_ESC) // tap ESC , Hold RaiseLayer
//#define KC_DLRA LT(_RAISE,KC_DEL) // tap ESC , Hold RaiseLayer
//#define KC_NPD TT(_NUMPAD) // tap Momentary NUMPAD , DualTap toggle NUMPAD
//#define KC_MSC TT(_MOUSECURSOR) // tap Momentary NUMPAD , DualTap toggle Mousecursor

/* Tap Dance */
#define KC_LGES TD(TD_LGUIESC)
#define KC_LGAP TD(TD_LGUIAPP)
#define KC_LAAP TD(TD_LALTAPP)
#define KC_SHCL TD(TD_SHIFTCAPS)
#define KC_LGNP TD(TD_LGUINMPD)
#define KC_LGMC TD(TD_LGUIMSCS)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {


  [_QWERTY] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     GRV , 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,MINS,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     TBAL, Q  , W  , E  , R  , T  ,                Y  , U  , I  , O  , P  ,EQL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     LCTL, A  , S  , D  , F  , G  ,                H  , J  , K  , L  ,SCLN,QUOT,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     SHCL, Z  , X  , C  , V  , B  ,ESRA,     RASE, N  , M  ,COCT,DOAL,SLGU,BLRS,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                       LAAP,SPLW,TBCT,         BSAL,ENLW,LGES
  //                  `----+----+----'        `----+----+----'
  ),


  [_LOWER] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     CADL,EXLM, AT ,HASH,DLR ,PERC,               CIRC,AMPR,ASTR,LPRN,RPRN,DEL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,TILD,UNDS,PLUS,PIPE,LABK,               RABK,PGUP, UP ,PGDN,HOME,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,GRV ,MINS,EQL ,BSLS,LBRC,               RBRC,LEFT,DOWN,RGHT,END ,ENT ,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         , RO ,JYEN,QUES,LPRN,LCBR,TAB ,         ,RCBR,RPRN,    ,    ,    ,    ,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,ESCT,         DLAL,    ,LGNP
  //                  `----+----+----'        `----+----+----'
  ),


  [_RAISE] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     F12 , F1 , F2 , F3 , F4 , F5 ,                F6 , F7 , F8 , F9 ,F10 ,F11 ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         , 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,BSPC,
  //|----+----+----+----+----+----+              |----+----+----+----+----+----|
         ,EXLM, AT ,HASH,DLR ,PERC,               CIRC,AMPR,ASTR,LPRN,RPRN,ENT ,
  //|----+----+----+----+----+----|----.    ,----|----+----+----+----+----+----|
         ,PLUS,MINS,EQL ,BSLS,QUOT,    ,         ,DQUO,SLSH,    ,    ,    ,    ,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,SPC ,    ,             ,ENT ,LGMC
  //                  `----+----+----'        `----+----+----'
  ),

  [_NUMPAD] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     NLCK,    ,    ,    ,    ,    ,                   , P7 , P8 , P9 ,PMNS,DEL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,HOME,PGUP, UP ,PGDN,LABK,               RABK, P4 , P5 , P6 ,PPLS,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,END ,LEFT,DOWN,RGHT,LPRN,               RPRN, P1 , P2 , P3 ,PAST,COLN,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         ,    ,    ,    ,    ,STAB,    ,      P0 ,EQL , P0 ,COMM,DOT ,PSLS,PENT,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
  ),

  [_MOUSECURSOR] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
         ,    ,    ,    ,    ,    ,                   ,    ,    ,    ,    ,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,HOME,PGUP, UP ,PGDN,    ,               WH_D,WH_R,MS_U,ACL0,ACL1,ACL2,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,END ,LEFT,DOWN,RGHT,    ,               WH_L,MS_L,MS_D,MS_R,BTN1,BTN2,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         ,    ,    ,    ,    ,    ,    ,         ,WH_U,LEFT,DOWN, UP ,RGHT,BTN3,
  //`----+----+----+----+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
),


  [_ADJUST] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     RST ,MUTE,VOLD,VOLU,    ,    ,                   ,    ,    ,    ,    ,PSCR,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,    ,    ,    ,    ,    ,               RTOG,RMOD,RHUI,RSAI,RVAI,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     MCPW,EJCT,MCVD,MCVU,    ,    ,                   ,DBUG,RHUD,RSAD,RVAD,    ,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     MUTE,    ,VOLD,VOLU,    ,    ,    ,         ,    ,    ,    ,    ,    ,BL_S,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
  )

};


/* TAP DANCE */
void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) {
  if (state->count >= 3) {
    register_code (KC_CAPS);
  } else {
    register_code (KC_LSFT);
  }
}

void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) {
  if (state->count >= 3) {
    unregister_code (KC_CAPS);
  } else {
    unregister_code (KC_LSFT);
  }
}

void dance_lgui_numpad_finished(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        register_code(KC_LGUI);
    }
}

void dance_lgui_numpad_reset(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        unregister_code(KC_LGUI);
    }
    else
    {
        uint8_t layer = biton32(layer_state);
        if (layer == _NUMPAD)
        {
            layer_off(_NUMPAD);
        } else {
            layer_on(_NUMPAD);
            layer_off(_MOUSECURSOR);
        }
    }
}


void dance_lgui_mousecursor_finished(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        register_code(KC_LGUI);
    }
}

void dance_lgui_mousecursor_reset(qk_tap_dance_state_t* state, void* user_data)
{
    if (state->count == 1)
    {
        unregister_code(KC_LGUI);
    }
    else
    {
        uint8_t layer = biton32(layer_state);
        if (layer == _MOUSECURSOR)
        {
            layer_off(_MOUSECURSOR);
        } else {
            layer_on(_MOUSECURSOR);
            layer_off(_NUMPAD);
        }
    }
}


qk_tap_dance_action_t tap_dance_actions[] = {

  // Tap once for L-GUI(Windows), twice for Escape
        [TD_LGUIESC] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_ESC),
  // Tap once for L-GUI(Windows), twice for APP
        [TD_LGUIAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_APP),
  // Tap once for R-Alt, twice for APP
        [TD_LALTAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LALT, KC_APP),
  // Tap once for Left Shift , trice for CAPS Lock
        [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up),
  // tap once for LGUI , twice for move to NUMPAD layer
        [TD_LGUINMPD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lgui_numpad_finished, dance_lgui_numpad_reset),
  // tap once for LGUI , twice for move to MOUSECURSOR layer
        [TD_LGUIMSCS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_lgui_mousecursor_finished, dance_lgui_mousecursor_reset)

};

/* END TAP DANCE */


void persistent_default_layer_set(uint16_t default_layer) {
  eeconfig_update_default_layer(default_layer);
  default_layer_set(default_layer);
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case QWERTY:
      if (record->event.pressed) {
        persistent_default_layer_set(1UL<<_qwerty break="" case="" false="" if="" lower:="" record-="" return="">event.pressed) {
        layer_on(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case RAISE:
      if (record->event.pressed) {
        layer_on(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case ADJUST:
      if (record->event.pressed) {
        layer_on(_ADJUST);
      } else {
        layer_off(_ADJUST);
      }
      return false;
      break;
  }
  return true;
}



2018-08-14

 ASCIIの記事を見ていたら思い切り作成したくなったので、色々発注してみた。

 順不同であるが、keymapの作成過程を書いてみる。

 先ずはdefaultを書き込んでみて色々試してみた。以下の事が徐々に判ったので、実装に反映した。

1)自分の手は思ったより小さい。小指の先のキーを使うのは結構大変。この手のエルゴキーボードは指をホームポジションから大きく動かさずに使うことが前提の様である。小指を伸ばしてホームポジションがずれるとミスタッチが増える。

2)最上段の列に指を伸ばすと同様にホームポジションから外れやすくなる。

3)親指担当のキーで内側上のキーはとても押しずらい。

4)横一列のhjklを使ったカーソルキーより逆Tのカーソルキー配列が使い易い。

5)業務でも使用するので、10キーは欲しい。

6)Macでも使用したい。

 上記を考慮すると以下の様な実装となった。

a)親指が最も押し易い中央のキーにSpace、Enterを配置。そして長押しでLowerLayerへ遷移とする。この結果、Spaceの押しっぱなしによる空白大量入力は出来なくなるが許容する。

b)LowerLayerに入力頻度の高い記号類、カーソルキーを極力配置する。

c)ModifierのALT,CTRL,Win、使用頻度の高いESC,BackSpace,TABは親指が担当する4キー中の下3キーの組み合わせで入力出来る様にする。

d)RaiseLayerはFnキー等の押し下げ頻度が低く、入力に時間が掛かっても良いキーを配置する。

e)10キー、マウスキーのLayerへの遷移はアクション数増加を許容。Lower,Raise状態にしてからDouble Tapでの遷移とする。

f)Lower,Raiseの同時押しが必要なAdjustLayerにMute,Volume等のハードウエア関連のキーを配置。


 特に6)を考慮したため、以下の様な事に留意している。

 Macでは所謂コマンド入力がコマンドキー押し下げ状態で英字を入力する。しかしながらWindowsではALT,Winを押し下げ後、一度離して英字を入力する。
 そのため、ALT(Mac OSでコマンドキーに設定),Win(Mac OSでOptionキーに設定)の長押しを別機能に割り当てる事はしない。

 WindowsではALT,Winの同時押しは発生しないが(あったらごめんなさい)Macでは発生する。そのため、両手にALT,Winキーを分散して配置する。

2018-08-11


#include "iris.h"
#include "action_layer.h"
#include "eeconfig.h"

extern keymap_config_t keymap_config;

#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define _NUMPAD 4
#define _MOUSECURSOR 8
#define _ADJUST 16

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  NUMPAD,
  MOUSECURSOR,
  ADJUST,
};

/* Tap Dance */
enum {
  TD_LGUIESC=0,
  TD_LGUIAPP,
  TD_LALTAPP,
  TD_SHIFTCAPS
};


#define KC_ KC_TRNS
#define _______ KC_TRNS

#define KC_LOWR LOWER
#define KC_RASE RAISE
#define KC_RST RESET
#define KC_BL_S BL_STEP
#define KC_DBUG DEBUG
#define KC_RTOG RGB_TOG
#define KC_RMOD RGB_MOD
#define KC_RHUI RGB_HUI
#define KC_RHUD RGB_HUD
#define KC_RSAI RGB_SAI
#define KC_RSAD RGB_SAD
#define KC_RVAI RGB_VAI
#define KC_RVAD RGB_VAD
#define KC_MCPW KC_POWER
#define KC_MCVU KC__VOLUP
#define KC_MCVD KC__VOLDOWN

#define KC_BSGU MT(MOD_LGUI, KC_BSPC) // tap BackSpace , Hold RGUI
#define KC_BSAL MT(MOD_LALT, KC_BSPC) // tap BackSpace , Hold LALT
#define KC_TBAL MT(MOD_LALT, KC_TAB) // tap TAB , Hold LALT
#define KC_SLGU MT(MOD_LGUI, KC_SLSH) // tap Slash , Hold LGUI
#define KC_DOAL MT(MOD_LALT, KC_DOT) // tap Dot , Hold LALT
#define KC_COCT MT(MOD_LCTL, KC_COMM) // tap Comma , Hold LCTL
#define KC_BLRS MT(MOD_RSFT, KC_BSLS) // tap BackSlash , Hold RSFT
#define KC_SPAT MT(MOD_LALT, KC_SPC) // tap Space , Hold LALT
#define KC_ESCT MT(MOD_LCTL, KC_ESC) // tap Escape , Hold LCTL
#define KC_TBCT MT(MOD_LCTL, KC_TAB) // tap TAB , Hold LCTL

#define KC_CMZ LGUI(KC_Z)
#define KC_CMX LGUI(KC_X)
#define KC_CMC LGUI(KC_C)
#define KC_CMV LGUI(KC_V)
#define KC_CADL ALTG(KC_DEL)
#define KC_STAB S(KC_TAB)


#define KC_SPLW LT(_LOWER,KC_SPC) // tap Space , Hold LowerLayer
#define KC_ENLW LT(_LOWER,KC_ENTER) // tap Enter , Hold LowerLayer
#define KC_ESRA LT(_RAISE,KC_ESC) // tap ESC , Hold RaiseLayer
#define KC_DLRA LT(_RAISE,KC_DEL) // tap ESC , Hold RaiseLayer
#define KC_NPD TT(_NUMPAD) // tap Momentary NUMPAD , DualTap toggle NUMPAD
#define KC_MSC TT(_MOUSECURSOR) // tap Momentary NUMPAD , DualTap toggle numpad

/* Tap Dance */
#define KC_LGES TD(TD_LGUIESC)
#define KC_LGAP TD(TD_LGUIAPP)
#define KC_LAAP TD(TD_LALTAPP)
#define KC_SHCL TD(TD_SHIFTCAPS)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {


  [_QWERTY] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     GRV , 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,MINS,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     TBAL, Q  , W  , E  , R  , T  ,                Y  , U  , I  , O  , P  ,EQL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     LCTL, A  , S  , D  , F  , G  ,                H  , J  , K  , L  ,SCLN,QUOT,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     SHCL, Z  , X  , C  , V  , B  ,ESRA,     RASE, N  , M  ,COCT,DOAL,SLGU,BLRS,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                       LAAP,SPLW,TBCT,         BSAL,ENLW,LGES
  //                  `----+----+----'        `----+----+----'
  ),


  [_LOWER] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     ESC ,EXLM, AT ,HASH,DLR ,PERC,               CIRC,AMPR,ASTR,LPRN,RPRN,DEL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,TILD,UNDS,PLUS,PIPE,LABK,               RABK,PGUP, UP ,PGDN,HOME,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,GRV ,MINS,EQL ,BSLS,LBRC,               RBRC,LEFT,DOWN,RGHT,END ,ENT ,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         , RO ,JYEN,QUES,LPRN,LCBR,TAB ,         ,RCBR,RPRN,    ,    ,    ,    ,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                       LGUI,    ,ESC ,         DEL ,    ,NPD
  //                  `----+----+----'        `----+----+----'
  ),


  [_RAISE] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     F12 , F1 , F2 , F3 , F4 , F5 ,                F6 , F7 , F8 , F9 ,F10 ,F11 ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     CADL, 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,BSPC,
  //|----+----+----+----+----+----+              |----+----+----+----+----+----|
         ,EXLM, AT ,HASH,DLR ,PERC,               CIRC,AMPR,ASTR,LPRN,RPRN,ENT ,
  //|----+----+----+----+----+----|----.    ,----|----+----+----+----+----+----|
     MUTE,PLUS,MINS,EQL ,BSLS,QUOT,    ,         ,DQUO,SLSH,    ,    ,    ,PSCR,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,SPC ,TAB ,         BSPC,ENT ,MSC
  //                  `----+----+----'        `----+----+----'
  ),

  [_NUMPAD] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     ESC ,    ,    ,    ,    ,    ,                   , P7 , P8 , P9 ,PMNS,DEL ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,HOME,PGUP, UP ,PGDN,LABK,               RABK, P4 , P5 , P6 ,PPLS,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,END ,LEFT,DOWN,RGHT,LPRN,               RPRN, P1 , P2 , P3 ,PAST,COLN,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         ,    ,    ,    ,    ,STAB,NLCK,      P0 ,EQL , P0 ,COMM,DOT ,PSLS,PENT,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
  ),

  [_MOUSECURSOR] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
         ,    ,    ,    ,    ,    ,                   ,    ,    ,    ,    ,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,HOME,PGUP, UP ,PGDN,    ,               WH_D,WH_R,MS_U,ACL0,ACL1,ACL2,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,END ,LEFT,DOWN,RGHT,    ,               WH_L,MS_L,MS_D,MS_R,BTN1,BTN2,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
         ,    ,    ,    ,    ,    ,    ,         ,WH_U,LEFT,DOWN, UP ,RGHT,BTN3,
  //`----+----+----+----+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
),


  [_ADJUST] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     RST ,MUTE,VOLD,VOLU,    ,    ,                   ,    ,    ,    ,    ,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
         ,    ,    ,    ,    ,    ,               RTOG,RMOD,RHUI,RSAI,RVAI,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     MCPW,EJCT,MCVD,MCVU,    ,    ,                   ,DBUG,RHUD,RSAD,RVAD,    ,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     MUTE,    ,VOLD,VOLU,    ,    ,    ,         ,    ,    ,    ,    ,    ,BL_S,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                           ,    ,    ,             ,    ,
  //                  `----+----+----'        `----+----+----'
  )

};


/* TAP DANCE */
void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) {
  if (state->count >= 3) {
    register_code (KC_CAPS);
  } else {
    register_code (KC_LSFT);
  }
}

void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) {
  if (state->count >= 3) {
    unregister_code (KC_CAPS);
  } else {
    unregister_code (KC_LSFT);
  }
}


qk_tap_dance_action_t tap_dance_actions[] = {

  // Tap once for L-GUI(Windows), twice for R-GUI(APP)
        [TD_LGUIESC] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_ESC),
  // Tap once for L-GUI(Windows), twice for R-GUI(APP)
        [TD_LGUIAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_APP),
  // Tap once for R-Alt, twice for R-GUI
        [TD_LALTAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LALT, KC_APP),
  // Tap once for Left Shift , trice for CAPS Lock
        [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up)
};

/* END TAP DANCE */


void persistent_default_layer_set(uint16_t default_layer) {
  eeconfig_update_default_layer(default_layer);
  default_layer_set(default_layer);
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case QWERTY:
      if (record->event.pressed) {
        persistent_default_layer_set(1UL<<_qwerty break="" case="" false="" if="" lower:="" record-="" return="">event.pressed) {
        layer_on(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case RAISE:
      if (record->event.pressed) {
        layer_on(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case ADJUST:
      if (record->event.pressed) {
        layer_on(_ADJUST);
      } else {
        layer_off(_ADJUST);
      }
      return false;
      break;
  }
  return true;
}



自己紹介

自分の写真
東京都, Japan
憂鬱な凍死家です。こちらではmixiとは異なり固めの話題中心です。

Total Page View

Categories

Powered by Blogger.

Popular Posts

Blog Archive