1
0
Fork 0

Add edvorakjp layout for the Iris keyboard (#3020)

* add edvorakjp libraries

* add edvorakjp iris keymap

* change the custom eeconfig's address to prevent future address conflicts

* deleted the verbose line of rule.mk
This commit is contained in:
epaew 2018-05-23 08:59:43 +09:00 committed by Drashna Jaelre
parent c465cf2fd3
commit 760b11b5e8
8 changed files with 662 additions and 0 deletions

246
users/edvorakjp/edvorakjp.c Normal file
View file

@ -0,0 +1,246 @@
#include "eeprom.h"
#include "edvorakjp.h"
bool japanese_mode;
uint16_t time_on_pressed;
edvorakjp_config_t edvorakjp_config;
uint8_t eeconfig_read_edvorakjp(void) {
return eeprom_read_byte(EECONFIG_EDVORAK);
}
void eeconfig_update_edvorakjp(uint8_t val) {
eeprom_update_byte(EECONFIG_EDVORAK, val);
}
void dvorakj_layer_off(void) {
layer_off(_EDVORAKJ1);
layer_off(_EDVORAKJ2);
}
void update_japanese_mode(bool new_state) {
japanese_mode = new_state;
if (japanese_mode) {
if (edvorakjp_config.enable_kc_lang) {
SEND_STRING(SS_TAP(X_LANG1));
} else {
SEND_STRING(SS_LALT("`"));
}
} else {
dvorakj_layer_off();
if (edvorakjp_config.enable_kc_lang) {
SEND_STRING(SS_TAP(X_LANG2));
} else {
SEND_STRING(SS_LALT("`"));
}
}
}
void matrix_init_user(void) {
japanese_mode = false;
time_on_pressed = 0;
edvorakjp_config.raw = eeconfig_read_edvorakjp();
matrix_init_keymap();
}
__attribute__ ((weak))
void matrix_init_keymap() {}
uint32_t layer_state_set_user(uint32_t state) {
state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
return layer_state_set_keymap(state);
}
__attribute__ ((weak))
uint32_t layer_state_set_keymap(uint32_t state) {
return state;
}
/*
* Each process_record_* methods defined here are
* return false if handle edvorak_keycodes, or return true others.
*/
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) {
if (!(edvorakjp_config.enable_jp_extra_layer &&\
(default_layer_state == 1UL<<_EDVORAK) &&\
japanese_mode &&\
record->event.pressed)) {
return true;
}
// consonant keys
// layer_on(J1) or layer_on(J2) are defined based on key positions.
switch (keycode) {
// right hand's left side w/o N
case KC_F:
case KC_G:
case KC_R:
case KC_D:
case KC_T:
case KC_B:
case KC_H:
case KC_J:
layer_on(_EDVORAKJ1);
register_code(keycode);
unregister_code(keycode);
return false;
// N: toggle layer
case KC_N:
biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off();
register_code(keycode);
unregister_code(keycode);
return false;
// left hand and right hand's right side
case KC_X:
case KC_C:
case KC_V:
case KC_Z:
case KC_P:
case KC_Y:
case KC_W:
case KC_Q:
case KC_S:
case KC_M:
case KC_K:
case KC_L:
layer_on(_EDVORAKJ2);
register_code(keycode);
unregister_code(keycode);
return false;
}
// vowel keys, symbol keys and modifier keys
dvorakj_layer_off();
switch (keycode) {
// combination vowel keys
case KC_AI:
SEND_STRING("ai");
return false;
case KC_OU:
SEND_STRING("ou");
return false;
case KC_EI:
SEND_STRING("ei");
return false;
case KC_ANN:
SEND_STRING("ann");
return false;
case KC_ONN:
SEND_STRING("onn");
return false;
case KC_ENN:
SEND_STRING("enn");
return false;
case KC_INN:
SEND_STRING("inn");
return false;
case KC_UNN:
SEND_STRING("unn");
return false;
// AOEIU and other (symbol, modifier) keys
default:
return true;
}
}
bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_MAC:
edvorakjp_config.enable_kc_lang = true;
eeconfig_update_edvorakjp(edvorakjp_config.raw);
return false;
case KC_WIN:
edvorakjp_config.enable_kc_lang = false;
eeconfig_update_edvorakjp(edvorakjp_config.raw);
return false;
case KC_EXTON:
edvorakjp_config.enable_jp_extra_layer = true;
eeconfig_update_edvorakjp(edvorakjp_config.raw);
return false;
case KC_EXTOFF:
edvorakjp_config.enable_jp_extra_layer = false;
eeconfig_update_edvorakjp(edvorakjp_config.raw);
return false;
}
return true;
}
bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case EDVORAK:
if (record->event.pressed) {
set_single_persistent_default_layer(_EDVORAK);
}
return false;
case QWERTY:
if (record->event.pressed) {
dvorakj_layer_off();
set_single_persistent_default_layer(_QWERTY);
}
return false;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
time_on_pressed = record->event.time;
} else {
layer_off(_LOWER);
if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
update_japanese_mode(false);
}
time_on_pressed = 0;
}
return false;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
time_on_pressed = record->event.time;
} else {
layer_off(_RAISE);
if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
update_japanese_mode(true);
}
time_on_pressed = 0;
}
return false;
default:
return true;
}
}
bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_JPN:
if (record->event.pressed) {
update_japanese_mode(true);
}
return false;
case KC_ENG:
if (record->event.pressed) {
update_japanese_mode(false);
}
return false;
default:
return true;
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return process_record_keymap(keycode, record) &&\
process_record_edvorakjp_ext(keycode, record) &&\
process_record_edvorakjp_config(keycode, record) &&\
process_record_layer(keycode, record) &&\
process_record_ime(keycode, record);
}

View file

@ -0,0 +1,74 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
#include "action_layer.h"
#define EECONFIG_EDVORAK (uint8_t *)20
extern keymap_config_t keymap_config;
typedef union {
uint8_t raw;
struct {
bool enable_jp_extra_layer : 1;
bool enable_kc_lang : 1; // for macOS
};
} edvorakjp_config_t;
enum edvorakjp_layers {
_EDVORAK = 0,
_EDVORAKJ1,
_EDVORAKJ2,
_QWERTY,
_LOWER,
_RAISE,
_ADJUST,
_EXTRA,
};
enum edvorakjp_keycodes {
EDVORAK = SAFE_RANGE,
QWERTY,
LOWER,
RAISE,
KC_MAC,
KC_WIN,
KC_EXTON,
KC_EXTOFF,
KC_JPN,
KC_ENG,
KC_AI,
KC_OU,
KC_EI,
KC_ANN,
KC_ONN,
KC_ENN,
KC_INN,
KC_UNN,
NEW_SAFE_RANGE
};
uint8_t eeconfig_read_edvorakjp(void);
void eeconfig_update_edvorakjp(uint8_t val);
void dvorakj_layer_off(void);
void update_japanese_mode(bool new_state);
void matrix_init_user(void);
void matrix_init_keymap(void);
uint32_t layer_state_set_user(uint32_t state);
uint32_t layer_state_set_keymap(uint32_t state);
/*
* Each process_record_* methods defined here are
* return false if processed, or return true if not processed.
* You can add your original macros in process_record_keymap() in keymap.c.
*/
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record);
bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record);
bool process_record_layer(uint16_t keycode, keyrecord_t *record);
bool process_record_ime(uint16_t keycode, keyrecord_t *record);
bool process_record_user(uint16_t keycode, keyrecord_t *record);
#endif

103
users/edvorakjp/readme.md Normal file
View file

@ -0,0 +1,103 @@
# edvorakjp
epaew's Enhanced Dvorak layout for Japanese Programmer
## Layout overview
This is a sample. You can swap any symbol keys and modifier keys.
- Base layer (for ansi layout)
```
//+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC ,
//+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+
TAB , ' , , , . , P , Y , F , G , R , W , Q , / , = , \ ,
//+------++---++---++---++---++---++---++---++---++---++---++---++---+-------+
CAPS , A , O , E , I , U , D , T , N , S , M , - , ENT ,
//+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-----------+
LSFT , ; , X , C , V , Z , B , H , J , K , L , RSFT ,
//+------+--+---++----++---+----+----+----+----+-+--+---++----++------+------+
LCTL , LGUI , LALT , SPACE , RALT , RGUI , MENU , RCTL
//+------+------+------+-------------------------+------+------+------+------+
```
- Base layer (for iso layout)
- Two C keys are placed, it's on purpose.
```
//+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC ,
//+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+
TAB , ' , , , . , P , Y , F , G , R , W , C , / , = ,
//+------++---++---++---++---++---++---++---++---++---++---++---++---++
CAPS , A , O , E , I , U , D , T , N , S , M , ; , - , ENT ,
//+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+------+
LSFT , Q , X , C , V , Z , B , H , J , K , L , \ , RSFT ,
//+------+--+---++----++---+----+----+----+----+-+--+---++----++---+--+------+
LCTL , LGUI , LALT , SPACE , RALT , RGUI , MENU , RCTL
//+------+------+------+-------------------------+------+------+------+------+
```
- Additional layer (common, blanks are transparent)
```
//+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
, , , , , , , , , , , , , ,
//+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+
, AI , OU , EI , , , , , , , , , , ,
//+------++---++---++---++---++---++---++---++---++---++---++---++---+-------+
, A , O , E , I , U , , Y1 , N , Y2 , , , ,
//+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-----------+
,ANN ,ONN ,ENN ,INN ,UNN , , , , , , ,
//+------+--+---++----++---+----+----+----+----+-+--+---++----++------+------+
, , , , , , ,
//+------+------+------+-------------------------+------+------+------+------+
```
And you can see [my iris keyboard layout](../../keyboards/iris/keymaps/edvorakjp/keymap.c) for sample implementation, too.
## for Japanese
- 日本語入力用のキーを追加
- IME 切り替えキー
- 長押しでレイヤー切り替え、短押しでIME切り替え
- macOS(かな/英数)、Windows(Alt+\`)の両方に対応
- DvorakJP(<http://www7.plala.or.jp/dvorakjp/>)を参考にした日本語入力用キーの導入
- 拗音入力用のYキーを追加配置
- 二重母音入力用のキー(AI, OU, EI)
- 撥音入力用のキー(ANN, ONN, ENN, INN, UNN)
- いずれかの子音を押下することで Additional layer が出現し、いずれかの母音を押下することで Base layer に戻ります※1※2
- ※1促音の入力に使うため、また連続で同じ指での打鍵を減らすために、
FGRDTNBHJ を押下した場合はy1が、それ以外の子音を押下した場合はy2が出現しません
- ※2撥音の入力のため、nを2連打すると、Base layerに戻ります
- Define some custom keys for typing Japanese
- IME switching
- act as LOWER/RAISE when hold, act as IME switching when tapped
- for macOS(かな/英数), for Windows(Alt+\`)
- oneshot combination keys, inspired from DvorakJP (<http://www7.plala.or.jp/dvorakjp/>)
- additional Y key to enter a contracted sound
- diphthong keys (AI, OU, EI)
- syllabic nasal (ANN, ONN, ENN, INN, UNN)
- Additional layer is appeared when you taps any consonant keys, and disappeared when you taps any diphthong keys.
## for Programmer
- Dvorak 配列をベースに、ショートカットでよく利用される XCV は QWERTY 配列の位置を維持
- Vimユーザのために、HJKL キーを横並びで配置
- デフォルトレイヤーには、数字キーの代わりに記号 `!@#$%^&*()` を配置
- mainly based on Dvorak layout, but XCV is available in the same position of QWERTY layout
- HJKL is lining side by side, for Vim users
- we can type `!@#$%^&*()` keys without shift keys in base layer
## License
Copyright 2018 Ryo Maeda epaew.333@gmail.com @epaew
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/>.

1
users/edvorakjp/rules.mk Normal file
View file

@ -0,0 +1 @@
SRC += edvorakjp.c