!!!参考
https://kiyooka.hatenablog.com/entry/2018/11/18/042524
https://qiita.com/sirojake/items/2e1c45f346b9ba3b9e7f
https://qiita.com/chesscommands/items/42ba11edd0f9b183ead7
https://note.mu/huaa/n/nd26474ae5b08
https://leico.github.io/TechnicalNote/QMK/key-customize
https://arekore.netlify.com/2018/0204-%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F/
https://scrapbox.io/self-made-kbds-ja/XD75
https://temcee.hatenablog.com/entry/diy_key_board
https://yhara.jp/LetsSplitKeySwitches
https://input.club/the-comparative-guide-to-mechanical-switches/
https://ysa256.blogspot.com/2018/06/xd752.html
https://scrapbox.io/self-made-kbds-ja/XD75
!ファームウェアビルド
https://ascii.jp/elem/000/001/645/1645504/
http://okapies.hateblo.jp/entry/2019/02/02/133953
https://beta.docs.qmk.fm/features/feature_macros
https://qiita.com/Nymphium/items/2775b8c3555f733fafdc
!日本語キーボードにする場合
https://note.mu/huaa/n/nd26474ae5b08
!!!必要なもの
,パーツ,説明
,PCB,ダイオードやマイコンを半田付けする基盤
,ダイオード,電流の流れを制御
,マイコン,ファームウェアをインストールし、キーボードとして動作させる。
,プレート,スイッチを固定するもの
,スイッチ,キーのスイッチ部。赤軸とか茶軸とかでキーの重さや音が変わる。
,キーキャップ,文字が書いてあるスイッチに被せるもの
,ケース,キーボード自体のケース
PCB、ダイオード、マイコンセットになっているキットも存在する。
半田付け不要で、組み合わせるだけで良いものものある。
!!!XD75re
!!概要
5x15の75キーで60%キーボードサイズのキーボード。
基盤にはダイオードやLEDが実装済みで販売されている。
キースイッチはホットスワップで半田付け不要なので、扱いやすい。
好きなキーキャップとキースイッチがあれば、簡単に組み立てが完了する。
,種類, キースイッチ, 半田付け
,XD75Re, MXのみ, 半田付け不要で、キースイッチはホットスワップ
,XD75Am,MX、ALPS両対応, 半田付けが必要
!!注文
,注文したもの, AliExpressのURL, 備考
,XD75REの基盤, https://ja.aliexpress.com/item/32818745981.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N, XD75Reを選択(黒い基盤)、白い方はXD75Amで半田付けが必要になるので注意
,ケース, https://ja.aliexpress.com/item/32821659665.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N, アクリルボードも付いてくる。
,プレート, https://ja.aliexpress.com/item/32821198488.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N, 上記のケースがあれば、このプレートは不要。無駄になってしまった。
,スイッチ, https://ja.aliexpress.com/item/32815810102.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N, 茶軸を80個ほど購入。静音茶軸の方が良かったかも。
,キーキャップ, https://ja.aliexpress.com/item/32997912293.html?spm=a2g0s.9042311.0.0.17b94c4dWB800N, 無難。さわり心地も悪くない。ただ、ctrlとかaltキーが少ない
!!組み立て
基本的に説明書はない。
+ケースの裏に基盤を当てて、四隅だけにキースイッチを取り付けて基盤を仮止めする
++ ※ケースにスイッチを全てはめてから、基盤を付けるとやりにくいので注意
+キースイッチをひとつづつ取り付け
+ネジとナットで基盤を固定。ネジが短いのでアクリルボードはそのままナットを締めることはできない。
+両サイドのネジ穴で基盤とアクリルボードを固定
最終的にケースは使わず、プレートのみにした。
ケースを使うと高さが高くなり、ちょっとゴツくなる。プレートのみだとコンパクトでスタイリッシュに見えるため。
!ケースを使った場合
{{a_img wiki.cgi?action=ATTACH&page=%BC%AB%BA%EE%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9+XD75re&file=img2%2Ejpg,img2.jpg,"target=_blank","style='width:300px;'"}}
!ケースを使わず、プレートのみの場合
{{a_img wiki.cgi?action=ATTACH&page=%BC%AB%BA%EE%A5%AD%A1%BC%A5%DC%A1%BC%A5%C9+XD75re&file=P1240528%2EJPG,P1240528.JPG,"target=_blank","style='width:300px;'"}}
!!プログラム
qmk firmwareでファームウェアの書き換えが可能。
https://github.com/qmk/qmk_firmware
!コンパイル、ファームウェアインストールの流れ(dockerを使う場合)
gitからクローン
git clone https://github.com/qmk/qmk_firmware.git
qmk_firmware/keyboards/xd75/keymaps
以下に幾つかサンプル的なプログラムがある。
qmk_firmware/keyboards/xd75/keymaps/default
が標準のキー配置。このdefaultをインストールする場合は
+ ./util/docker_build.sh xd75:default:dfu
+ キーボード側をリセットする
++ リセットする方法1:基盤の真ん中のスイッチをショートさせる。ケースの真ん中に穴が開いている。ここを除くと2つの穴が見えるので、細いクリップ等でショートさせる。
++ (基盤を裏から見ると真ん中に6つのスイッチが縦に並んでいる。この一番上の2つ。表からショートさせるのが難しい場合は裏からショートさせると楽)
++ リセットする方法2:キー配置を変更する際に、リセットキーを配置することが出来る。このキーで物理的にショートしなくてもリセットが出来る。
!コンパイル、ファームウェアインストールの流れ(docker以外の場合)
gitからクローン
git clone https://github.com/qmk/qmk_firmware.git
コンパイルに必要なパッケージを準備する。
パッケージをインストールするコマンドが準備されている。環境によりコマンドが違う。
./util/linux_install.sh
とか
./util/mac_install.sh
とか
パッケージが準備されたら
make xd75:default:dfu
キーボードのリセット等は上記のdockerを利用する場合と同じ。
!自分独自のキー配置やマクロを作成する
もし自分用のキー配置やマクロを作成する場合は適当なディレクトリを
qmk_firmware/keyboards/xd75/keymaps/hoge
などを作成して
config.h
keymap.c
readme.md
rules.mk
をdefaultからコピーする。keymap.c を書き換えて
./util/docker_build.sh xd75:hoge:dfu
make xd75:hoge:dfu
!!qmk_firmware の ドキュメント
https://docs.qmk.fm/
https://github.com/qmk/qmk_firmware/tree/master/docs
!!qmk_firmware で同時押しを実現する
qmk firmware ではキー押してレイアウトを変更しながら、順番で好きな動作をさせることが出来るが、順番に関係なく同時押しで動きを変えたいことがある。
やり方が正しいかどうかは分からないが、同時押しで動きを変えるには
+ 物理的に押されている/離されているキーを記憶
+ 物理的に押されている/離されているキーから判断して、論理的に押したことにしたい/離されたことにしたいキーの信号を送信
をすれば同時押しを実現可能。
!サンプル
Linux、Windowsの場合は、Ctrl + 矢印キー で単語移動、段落移動、Ctrl + Shift + 矢印キー で単語選択、段落選択が標準的な動きだけど
Macの場合は、Optionキーだったり、Cmdキーだったりでわかりにくいので、Cmd + 矢印キーで単語移動やHome、Endで行末移動を出来るようにする。
具体的には、Mac用のレイヤーにしているときは、物理的にCmdと矢印キーが押された場合に、他のキーに置き換えてしまう。
/* Copyright 2017 Wunder
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include QMK_KEYBOARD_H
#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi
#define JP_YEN KC_INT3 // yen, |
#define JP_CIRC KC_EQL // ^, ~
#define JP_AT KC_LBRC // @, `
#define JP_LBRC KC_RBRC // [, {
#define JP_COLN KC_QUOT // :, *
#define JP_RBRC KC_NUHS // ], }
#define JP_BSLS KC_INT1 // \, _
// Layer shorthand
#define _USB 0
#define _JPB 1
// Layer shorthand
#define _US1 2
#define _JP1 3
#define _JP2 4
// Layer For Mac
#define _MUB 5
#define _MJB 6
#define _MU1 7
#define _MJ1 8
#define _MJ2 9
#define _MJ3 10
// Layer For Common
#define __CS 11
#define __FN 12
#define _FN2 13
#define _FN3 14
// #define _MCS 4
// #define _MFN 5
#define _MNT 15
#define _TMP 16
#define KC_WMH LT(__CS, KC_MHEN)
#define KC_WHN LT(__FN, KC_HENK)
#define KC_MMH LT(__CS, KC_LANG2)
#define KC_MHN LT(__FN, KC_LANG1)
#define KEYS_MAX 256
#define PHYS 0
#define LOGI 1
#define TRAN 2
bool keys[KEYS_MAX][3] = {};
#define MODE_NORMAL 0
#define MODE_MAC 1
uint8_t mode = MODE_NORMAL;
uint8_t layer = _USB;
// Defines the keycodes used by our macros in process_record_user
// とりあえず、使わない
enum custom_keycodes {
QMKBEST = SAFE_RANGE,
QMKURL
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY(US)
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | PG UP | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
* | PG DN | LCTRL | A | S | D | F | G | H | J | K | L | ; | ' | ` | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
* | HOME | LSHIFT | Z | X | C | V | B | N | M | , | . | / | RSHIFT | RSHIFT | RCTRL |
* |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
* | END | LCTRL | LGUI | LALT | LALT | FN/MHEN| SPACE | SPACE | FN/HEN | RALT | MENU | LEFT | DOWN | UP | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_USB] = LAYOUT_ortho_5x15( /* QWERTY */
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC,
KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_PGDN, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_GRV, KC_ENT,
KC_HOME, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_RCTL,
KC_END, KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, KC_WMH, KC_SPC, KC_RSFT, KC_WHN, KC_RALT, KC_APP, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
),
/* QWERTY(JP)
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | -, = | ^, ~ | \, | | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | PG UP | TAB | Q | W | E | R | T | Y | U | I | O | P | @, ` | [, { | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
* | PG DN | LCTRL | A | S | D | F | G | H | J | K | L | ;, + | :, * | ], } | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
* | HOME | LSHIFT | Z | X | C | V | B | N | M | , | . | /, ? | \, _ | RSHIFT | RCTRL |
* |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
* | END | LCTRL | LGUI | LALT | LALT | FN/MHEN| SPACE | SPACE | FN/HEN | RALT | MENU | LEFT | DOWN | UP | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_JPB] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_US1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_JP1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LCTL, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_JP2] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_MUB] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RGUI,
_______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH, _______, _______, KC_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MJB] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
_______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI,
_______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH, _______, _______, KC_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MU1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RGUI,
KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH, _______, _______, KC_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MJ1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LGUI, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI,
KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH, _______, _______, KC_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MJ2] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LGUI, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI,
KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH, _______, _______, KC_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MJ3] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LGUI, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI,
KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, KC_MMH, _______, _______, KC_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[__CS] = LAYOUT_ortho_5x15( /* FUNCTION */
JP_ZHTG, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, KC_DEL, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_F2, KC_UP, KC_PGUP, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, KC_ESC, KC_LEFT, KC_DOWN, KC_RIGHT, KC_HOME, KC_END, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, _______, _______, _______, _______,
_______, _______, _______, _______, _______, MO(__CS), _______, _______, MO(_FN3), _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),
[__FN] = LAYOUT_ortho_5x15( /* FUNCTION */
JP_ZHTG, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_F2, KC_UP, KC_PGUP, _______, KC_PSCR, KC_SLCK, KC_PAUS,
_______, _______, _______, _______, _______, _______, _______, KC_ESC, KC_LEFT, KC_DOWN, KC_RIGHT, KC_HOME, KC_END, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, _______, _______, _______, _______,
_______, _______, _______, _______, _______, MO(_FN2), _______, _______, MO(__FN), _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),
[_FN2] = LAYOUT_ortho_5x15( /* FUNCTION */
KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSLS, KC_PAST, KC_BSPC,
KC_VOLU, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_VOLD, _______, _______, KC_MPLY, KC_MPRV, KC_MNXT, _______, _______, KC_INS, KC_HOME, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PPLS,
_______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, KC_P1, KC_P2, KC_P3, KC_PENT,
_______, _______, _______, _______, _______, MO(_FN2), _______, _______, MO(_FN2), _______, _______, KC_P0, KC_P0, KC_PDOT, KC_PENT
),
[_FN3] = LAYOUT_ortho_5x15( /* FUNCTION */
TO(_USB),TO(_US1), TO(_MUB), TO(_MU1), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_MNT),
TO(_JPB),TO(_JP1), TO(_MJB), TO(_MJ1), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, TO(_JP2), _______, TO(_MJ2), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, TO(_MJ3), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, MO(_FN3), _______, _______, MO(_FN3), _______, _______, _______, _______, _______, _______
),
[_MNT] = LAYOUT_ortho_5x15( /* FUNCTION */
TO(_USB),XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
RGB_TOG, RGB_MOD, RGB_RMOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX,
RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
),
[_TMP] = LAYOUT_ortho_5x15( /* FUNCTION */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_MNT),
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
void clear(uint8_t kind) {
for (int i = 0; i < KEYS_MAX; i++ ) {
keys[i][kind] = false;
}
}
bool isPressed(uint8_t kind, uint16_t keycode) {
return keys[keycode][kind];
}
void pressKey(uint8_t kind, uint16_t keycode) {
keys[keycode][kind] = true;
}
void releaseKey(uint8_t kind, uint16_t keycode) {
keys[keycode][kind] = false;
}
// 最終的に必要なキーのみを設定。足りないものを押して、不要なものをリリースする。
void fixKey(uint8_t kind) {
// 離すときは文字キーから離す
for (int i = 0; i < KEYS_MAX; i++) {
if (keys[i][kind] != keys[i][LOGI] && !keys[i][kind]) {
unregister_code(i);
keys[i][LOGI] = keys[i][kind];
}
}
// 押すときは修飾キーから押す
for (int i = KEYS_MAX - 1; i >= 0 ; i--) {
if (keys[i][kind] != keys[i][LOGI] && keys[i][kind]) {
register_code(i);
keys[i][LOGI] = keys[i][kind];
}
}
}
bool processKey(uint32_t keycode, bool pressed) {
clear(TRAN);
bool trans = false;
if (mode == MODE_MAC) {
if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
if (isPressed(PHYS, KC_UP)) {
pressKey(TRAN, KC_UP);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
trans = true;
}
if (isPressed(PHYS, KC_LEFT)) {
pressKey(TRAN, KC_LEFT);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
trans = true;
}
if (isPressed(PHYS, KC_DOWN)) {
pressKey(TRAN, KC_DOWN);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
trans = true;
}
if (isPressed(PHYS, KC_RIGHT)) {
pressKey(TRAN, KC_RIGHT);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
trans = true;
}
if (isPressed(PHYS, KC_HOME)) {
pressKey(TRAN, KC_LGUI);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_UP);
} else {
pressKey(TRAN, KC_LEFT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
trans = true;
}
if (isPressed(PHYS, KC_END)) {
pressKey(TRAN, KC_LGUI);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_DOWN);
} else {
pressKey(TRAN, KC_RIGHT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
trans = true;
}
if (isPressed(PHYS, KC_BSPC)) {
pressKey(TRAN, KC_BSPC);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
if (isPressed(PHYS, KC_DEL)) {
pressKey(TRAN, KC_DEL);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
if (isPressed(PHYS, KC_P)) {
pressKey(TRAN, KC_PGUP);
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
if (isPressed(PHYS, KC_LBRC)) {
pressKey(TRAN, KC_PGDN);
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
}
} else {
if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
if (isPressed(PHYS, KC_P)) {
pressKey(TRAN, KC_PGUP);
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
if (isPressed(PHYS, KC_LBRC)) {
pressKey(TRAN, KC_PGDN);
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
}
}
if (trans) {
fixKey(TRAN);
} else {
fixKey(PHYS);
}
return false;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (KEYS_MAX <= keycode) {
return true;
}
bool pressed = record->event.pressed;
if (pressed) {
keys[keycode][PHYS] = true;
} else {
keys[keycode][PHYS] = false;
}
return processKey(keycode, pressed);
}
void matrix_init_user(void) {
rgblight_enable();
rgblight_mode(1);
rgblight_setrgb(0, 0, 0);
}
void matrix_scan_user(void) {
}
void led_set_user(uint8_t usb_led) {}
uint32_t layer_state_set_user(uint32_t state) {
layer = biton32(state);
if (layer == _MNT) {
rgblight_setrgb(30, 0, 0);
} else {
rgblight_setrgb(0, 0, 0);
}
if (_MUB <= layer && layer <= _MJ3) {
mode = MODE_MAC;
} else if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
// do nothing
} else {
mode = MODE_NORMAL;
}
return state;
}
!サンプル2
/* Copyright 2017 Wunder
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include QMK_KEYBOARD_H
#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi
#define JP_YEN KC_INT3 // yen, |
#define JP_CIRC KC_EQL // ^, ~
#define JP_AT KC_LBRC // @, `
#define JP_LBRC KC_RBRC // [, {
#define JP_COLN KC_QUOT // :, *
#define JP_RBRC KC_NUHS // ], }
#define JP_BSLS KC_INT1 // \, _
// Layer shorthand
enum layuer_shorthand {
_USB = 0,
_JPB,
_US1,
_JP1,
_MUB,
_MJB,
_MU1,
_MJ1,
_MJ2,
__CS,
__FN,
_FN2,
_FN3,
_MNT,
_TMP,
};
// #define CK_WMH LT(__CS, KC_MHEN)
// #define CK_WHN LT(__FN, KC_HENK)
// #define CK_MMH LT(__CS, KC_LANG2)
// #define CK_MHN LT(__FN, KC_LANG1)
#define KEYS_MAX 256
#define PHYS 0
#define LOGI 1
#define TRAN 2
bool keys[KEYS_MAX][3] = {};
#define MODE_NORMAL 0
#define MODE_MAC 1
uint8_t mode = MODE_NORMAL;
uint8_t layer = _USB;
uint16_t last_press_keycode = KC_NO;
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
QMKBEST = SAFE_RANGE,
CK_WMH,
CK_WHN,
CK_MMH,
CK_MHN,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY(US)
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | PG UP | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
* | PG DN | LCTRL | A | S | D | F | G | H | J | K | L | ; | ' | ` | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
* | HOME | LSHIFT | Z | X | C | V | B | N | M | , | . | / | RSHIFT | RSHIFT | RCTRL |
* |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
* | END | LCTRL | LGUI | LALT | LALT | FN/MHEN| SPACE | SPACE | FN/HEN | RALT | MENU | LEFT | DOWN | UP | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_USB] = LAYOUT_ortho_5x15( /* QWERTY */
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC,
KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_PGDN, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_GRV, KC_ENT,
KC_HOME, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_RCTL,
KC_END, KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, CK_WMH, KC_SPC, KC_SPC, CK_WHN, KC_RALT, KC_APP, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
),
/* QWERTY(JP)
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | -, = | ^, ~ | \, | | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | PG UP | TAB | Q | W | E | R | T | Y | U | I | O | P | @, ` | [, { | DEL |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
* | PG DN | LCTRL | A | S | D | F | G | H | J | K | L | ;, + | :, * | ], } | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
* | HOME | LSHIFT | Z | X | C | V | B | N | M | , | . | /, ? | \, _ | RSHIFT | RCTRL |
* |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
* | END | LCTRL | LGUI | LALT | LALT | FN/MHEN| SPACE | SPACE | FN/HEN | RALT | MENU | LEFT | DOWN | UP | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_JPB] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_US1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, KC_RSFT, _______, _______, _______, _______, _______, _______, _______
),
[_JP1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, _______,
KC_LCTL, KC_LCTL, _______, _______, _______, _______, _______, KC_RSFT, _______, _______, _______, _______, _______, _______, _______
),
[_MUB] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RGUI,
_______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH, _______, _______, CK_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MJB] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
_______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI,
_______, KC_LGUI, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH, _______, _______, CK_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MU1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LGUI, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RGUI,
KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH, _______, KC_RSFT, CK_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MJ1] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LGUI, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI,
KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH, _______, KC_RSFT, CK_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[_MJ2] = LAYOUT_ortho_5x15( /* QWERTY */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______,
KC_TAB, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______,
KC_LGUI, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______,
KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI,
KC_LGUI, KC_LCTL, KC_LALT, KC_LCTL, KC_LCTL, CK_MMH, _______, KC_RSFT, CK_MHN, KC_RCTL, _______, _______, _______, _______, _______
),
[__CS] = LAYOUT_ortho_5x15( /* FUNCTION */
JP_ZHTG, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, KC_DEL, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_F2, KC_UP, KC_PGUP, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, KC_ESC, KC_LEFT, KC_DOWN, KC_RIGHT, KC_HOME, KC_END, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, MO(_FN3), _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),
[__FN] = LAYOUT_ortho_5x15( /* FUNCTION */
JP_ZHTG, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_F2, KC_UP, KC_PGUP, _______, KC_PSCR, KC_SLCK, KC_PAUS,
_______, _______, _______, _______, _______, _______, _______, KC_ESC, KC_LEFT, KC_DOWN, KC_RIGHT, KC_HOME, KC_END, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, _______, _______, _______, _______,
_______, _______, _______, _______, _______, MO(_FN2), _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),
[_FN2] = LAYOUT_ortho_5x15( /* FUNCTION */
KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSLS, KC_PAST, KC_BSPC,
KC_VOLU, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_VOLD, _______, _______, KC_MPLY, KC_MPRV, KC_MNXT, _______, _______, KC_INS, KC_HOME, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PPLS,
_______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, KC_END, KC_PGDN, KC_P1, KC_P2, KC_P3, KC_PENT,
_______, _______, _______, _______, _______, MO(_FN2), _______, _______, MO(_FN2), _______, _______, KC_P0, KC_P0, KC_PDOT, KC_PENT
),
[_FN3] = LAYOUT_ortho_5x15( /* FUNCTION */
TO(_USB),TO(_JPB), TO(_MUB), TO(_MJB), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_MNT),
TO(_US1),TO(_JP1), TO(_MU1), TO(_MJ1), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, TO(_MJ2), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, MO(_FN3), _______, _______, MO(_FN3), _______, _______, _______, _______, _______, _______
),
[_MNT] = LAYOUT_ortho_5x15( /* FUNCTION */
TO(_USB),XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
RGB_TOG, RGB_MOD, RGB_RMOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX,
RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
),
[_TMP] = LAYOUT_ortho_5x15( /* FUNCTION */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TO(_MNT),
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
void clear(uint8_t kind) {
for (int i = 0; i < KEYS_MAX; i++ ) {
keys[i][kind] = false;
}
}
bool isPressed(uint8_t kind, uint16_t keycode) {
return keys[keycode][kind];
}
void pressKey(uint8_t kind, uint16_t keycode) {
keys[keycode][kind] = true;
}
void releaseKey(uint8_t kind, uint16_t keycode) {
keys[keycode][kind] = false;
}
// 最終的に必要なキーのみを設定。足りないものを押して、不要なものをリリースする。
void fixKey(uint8_t kind) {
// 離すときは文字キーから離す
for (int i = 0; i < KEYS_MAX; i++) {
if (keys[i][kind] != keys[i][LOGI] && !keys[i][kind]) {
unregister_code(i);
keys[i][LOGI] = keys[i][kind];
}
}
// 押すときは修飾キーから押す
for (int i = KEYS_MAX - 1; i >= 0 ; i--) {
if (keys[i][kind] != keys[i][LOGI] && keys[i][kind]) {
register_code(i);
keys[i][LOGI] = keys[i][kind];
}
}
}
bool processKey(uint32_t keycode, bool pressed) {
clear(TRAN);
bool trans = false;
if (mode == MODE_MAC) {
if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
if (isPressed(PHYS, KC_UP)) {
pressKey(TRAN, KC_UP);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_LEFT)) {
pressKey(TRAN, KC_LEFT);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_DOWN)) {
pressKey(TRAN, KC_DOWN);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_RIGHT)) {
pressKey(TRAN, KC_RIGHT);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_HOME)) {
pressKey(TRAN, KC_LGUI);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_UP);
} else {
pressKey(TRAN, KC_LEFT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_END)) {
pressKey(TRAN, KC_LGUI);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_DOWN);
} else {
pressKey(TRAN, KC_RIGHT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_BSPC)) {
pressKey(TRAN, KC_BSPC);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_DEL)) {
pressKey(TRAN, KC_DEL);
if (isPressed(PHYS, KC_LGUI)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LSFT)) {
pressKey(TRAN, KC_LSFT);
}
if (isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_RSFT);
}
if (isPressed(PHYS, KC_LALT)) {
pressKey(TRAN, KC_LALT);
}
if (isPressed(PHYS, KC_LCTL)) {
pressKey(TRAN, KC_LCTL);
}
trans = true;
}
if (isPressed(PHYS, KC_P)) {
pressKey(TRAN, KC_PGUP);
if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
if (isPressed(PHYS, KC_LBRC)) {
pressKey(TRAN, KC_PGDN);
if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
}
} else {
if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
if (isPressed(PHYS, KC_P)) {
pressKey(TRAN, KC_PGUP);
if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
if (isPressed(PHYS, KC_LBRC)) {
pressKey(TRAN, KC_PGDN);
if (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) {
pressKey(TRAN, KC_LCTL);
} else {
pressKey(TRAN, KC_LALT);
}
trans = true;
}
}
}
if (trans) {
fixKey(TRAN);
} else {
fixKey(PHYS);
}
return false;
}
void processHenkanMuhenkan(uint16_t keycode, bool pressed) {
if (pressed) {
switch (keycode) {
case CK_WMH:
case CK_MMH:
layer_on(__CS);
break;
case CK_WHN:
case CK_MHN:
layer_on(__FN);
break;
}
last_press_keycode = keycode;
} else {
switch (keycode) {
case CK_WMH:
case CK_MMH:
layer_off(__CS);
break;
case CK_WHN:
case CK_MHN:
layer_off(__FN);
break;
}
if (last_press_keycode == keycode) {
switch (keycode) {
case CK_WMH:
register_code(KC_MHEN);
unregister_code(KC_MHEN);
break;
case CK_MMH:
register_code(KC_LANG2);
unregister_code(KC_LANG2);
break;
case CK_WHN:
register_code(KC_HENK);
unregister_code(KC_HENK);
break;
case CK_MHN:
register_code(KC_LANG1);
unregister_code(KC_LANG1);
break;
}
}
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool pressed = record->event.pressed;
processHenkanMuhenkan(keycode, pressed);
if (KEYS_MAX <= keycode) {
return true;
}
if (pressed) {
keys[keycode][PHYS] = true;
} else {
keys[keycode][PHYS] = false;
}
return processKey(keycode, pressed);
}
void matrix_init_user(void) {
rgblight_enable();
rgblight_mode(1);
rgblight_setrgb(0, 0, 0);
}
void matrix_scan_user(void) {
}
void led_set_user(uint8_t usb_led) {}
uint32_t layer_state_set_user(uint32_t state) {
layer = biton32(state);
if (layer == _MNT) {
rgblight_setrgb(30, 0, 0);
} else {
rgblight_setrgb(0, 0, 0);
}
if (_MUB <= layer && layer <= _MJ2) {
mode = MODE_MAC;
} else if (layer == __CS || layer == __FN || layer == _FN2 || layer == _FN3) {
// do nothing
} else {
mode = MODE_NORMAL;
}
return state;
}
{{category2 ハードウェア}}
{{comment reverse}}