参考
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キーが少ない |
組み立て
基本的に説明書はない。
- ケースの裏に基盤を当てて、四隅だけにキースイッチを取り付けて基盤を仮止めする
- ※ケースにスイッチを全てはめてから、基盤を付けるとやりにくいので注意
- キースイッチをひとつづつ取り付け
- ネジとナットで基盤を固定。ネジが短いのでアクリルボードはそのままナットを締めることはできない。
- 両サイドのネジ穴で基盤とアクリルボードを固定
最終的にケースは使わず、プレートのみにした。
ケースを使うと高さが高くなり、ちょっとゴツくなる。プレートのみだとコンパクトでスタイリッシュに見えるため。
ケースを使った場合
ケースを使わず、プレートのみの場合
プログラム
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と矢印キーが押された場合に、他のキーに置き換えてしまう。
// ./util/docker_build.sh xd75:funa:dfu // // 環境構築 // git submodule update // docker pull docker.io/qmkfm/base_container@sha256:9332edaa5786ede645f1c640986c65c41db64295742f8d3ab8e80dd3c0b759d3 // docker tag 647c77b2cb42 qmkfm/base_container:latest /* 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 <http://www.gnu.org/licenses/>. */ #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, _MJ3, __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; #define TRAN_DISABLE 0 #define TRAN_ENABLE 1 uint8_t CAN_TRAN = TRAN_ENABLE; uint8_t CAN_WTRAN = TRAN_DISABLE; // Windows用キー変換 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, CK_LMMN, // Mac用ニーモニックキー(左) CK_RMMN, // Mac用ニーモニックキー(右) CK_TRDS, // キー変換無効(tran disable) CK_TREN, // キー変換有効(tran enable) CK_WTRDS, // Windows用キー変換無効(tran disable) CK_WTREN, // Windows用キー変換有効(tran enable) }; 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 | UP | RCTRL | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| * | END | LCTRL | LGUI | LALT | LALT | FN/MHEN| SPACE | SPACE | FN/HEN | RALT | MENU | RSHIFT | LEFT | DOWN | 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_UP, 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_RSFT, KC_LEFT, KC_DOWN, 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 | , | . | /, ? | \, _ | UP | RCTRL | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| * | END | LCTRL | LGUI | LALT | LALT | FN/MHEN| SPACE | SPACE | FN/HEN | RALT | MENU | RSHIFT | LEFT | DOWN | 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, CK_LMMN, KC_LCTL, CK_MMH, _______, _______, CK_MHN, KC_RCTL, CK_RMMN, _______, _______, _______, _______ ), [_MJB] = LAYOUT_ortho_5x15( /* QWERTY */ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_YEN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_AT, JP_LBRC, _______, _______, KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, JP_BSLS, _______, KC_RGUI, _______, KC_LGUI, KC_LALT, CK_LMMN, KC_LCTL, CK_MMH, _______, _______, CK_MHN, KC_RCTL, CK_RMMN, _______, _______, _______, _______ ), [_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, CK_LMMN, KC_LCTL, CK_MMH, _______, KC_RSFT, CK_MHN, KC_RCTL, CK_RMMN, _______, _______, _______, _______ ), [_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, CK_LMMN, KC_LCTL, CK_MMH, _______, KC_RSFT, CK_MHN, KC_RCTL, CK_RMMN, _______, _______, _______, _______ ), [_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, CK_LMMN, KC_LCTL, CK_MMH, _______, KC_RSFT, CK_MHN, KC_RCTL, CK_RMMN, _______, _______, _______, _______ ), [_MJ3] = 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_RGUI, KC_LGUI, KC_LGUI, KC_LALT, CK_LMMN, KC_LCTL, CK_MMH, _______, KC_RSFT, CK_MHN, KC_RCTL, CK_RMMN, _______, _______, _______, _______ ), [__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, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, MO(_FN3), _______, _______, _______, KC_HOME, KC_PGDN, 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_ESC, KC_LEFT, KC_DOWN, KC_RIGHT, KC_HOME, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, TG(_FN2), _______, _______, KC_PGDN, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, MO(_FN2), _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END ), [_FN2] = LAYOUT_ortho_5x15( /* FUNCTION */ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NLCK, KC_TAB, KC_PSLS, KC_PAST, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 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), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CK_WTREN, CK_WTRDS, _______, TO(_MJ3), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CK_TREN, CK_TRDS, _______, _______, _______, 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, RESET , XXXXXXX, 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 (CAN_WTRAN == TRAN_ENABLE) { if ((isPressed(PHYS, KC_LALT) || isPressed(PHYS, KC_RALT)) && isPressed(PHYS, JP_AT) && (!isPressed(PHYS, KC_LCTL) && !isPressed(PHYS, KC_RCTL)) && (!isPressed(PHYS, KC_LSFT) && !isPressed(PHYS, KC_RSFT)) ) { pressKey(TRAN, KC_LALT); pressKey(TRAN, KC_PGDN); trans = true; } else if ((isPressed(PHYS, KC_LCTL) || isPressed(PHYS, KC_RCTL)) && (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) && isPressed(PHYS, KC_V)) { releaseKey(PHYS, KC_LCTL); releaseKey(PHYS, KC_RCTL); pressKey(TRAN, KC_LGUI); pressKey(TRAN, KC_V); trans = true; } else if ((isPressed(PHYS, KC_LCTL) || isPressed(PHYS, KC_RCTL)) && (isPressed(PHYS, KC_LSFT) || isPressed(PHYS, KC_RSFT)) && isPressed(PHYS, JP_YEN)) { pressKey(TRAN, KC_LGUI); pressKey(TRAN, KC_TAB); trans = true; } else if ((isPressed(PHYS, KC_LCTL) || isPressed(PHYS, KC_RCTL)) && (isPressed(PHYS, KC_LGUI) || isPressed(PHYS, KC_RGUI))) { int screen = 0; if(isPressed(PHYS, KC_U)) { screen = 1; } else if(isPressed(PHYS, KC_I)) { screen = 2; } else if(isPressed(PHYS, KC_O)) { screen = 3; } else if(isPressed(PHYS, KC_J)) { screen = 4; } else if(isPressed(PHYS, KC_K)) { screen = 5; } else if(isPressed(PHYS, KC_L)) { screen = 6; } else if(isPressed(PHYS, KC_M)) { screen = 7; } else if(isPressed(PHYS, KC_COMM)) { screen = 8; } else if(isPressed(PHYS, KC_DOT)) { screen = 9; } if (screen != 0) { for(int i = 0; i < 9; i++) { register_code(KC_RGUI); register_code(KC_LCTL); tap_code(KC_LEFT); } for(int i = 0; i < screen - 1; i++) { register_code(KC_RGUI); register_code(KC_LCTL); tap_code(KC_RIGHT); } unregister_code(KC_LCTL); unregister_code(KC_RGUI); return false; } } } 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; } } } } void processCanTran(uint16_t keycode, bool pressed) { if (pressed) { switch (keycode) { case CK_TRDS: CAN_TRAN = TRAN_DISABLE; break; case CK_TREN: CAN_TRAN = TRAN_ENABLE; break; } switch (keycode) { case CK_WTRDS: CAN_WTRAN = TRAN_DISABLE; break; case CK_WTREN: CAN_WTRAN = TRAN_ENABLE; break; } } } void processMacMnemonic(uint16_t keycode, bool pressed) { if (pressed) { switch (keycode) { case CK_LMMN: register_code(KC_LCTL); register_code(KC_LALT); break; case CK_RMMN: register_code(KC_RCTL); register_code(KC_LALT); break; } } else { switch (keycode) { case CK_LMMN: unregister_code(KC_LCTL); unregister_code(KC_LALT); break; case CK_RMMN: unregister_code(KC_RCTL); unregister_code(KC_LALT); break; } } } bool process_record_user(uint16_t keycode, keyrecord_t *record) { bool pressed = record->event.pressed; processHenkanMuhenkan(keycode, pressed); processMacMnemonic(keycode, pressed); processCanTran(keycode, pressed); if (CAN_TRAN == TRAN_DISABLE) { return true; } 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; }
[カテゴリ: ハードウェア]
[通知用URL]
Tweet
最終更新時間:2025年01月12日 14時04分40秒