TTTキーボード研究室


Leia4 mini配列 QMK Firmwareソースコード(YKDK21キーボード)

●説明

YKDK21キーボード用のソースコードです。QMK Firmware 0.23を使用しています。ファイル名は「keymap.c」です。

YKDK21キーボードは24キーモデルを使用しています(6×4の格子配列)。

Androidでの使用を前提にしていますのでOS毎のレイヤーは用意していません。commandキーもありませんのでiOSでもそのまま使えます。

表計算アプリ(Numbers)でキーマップとコンボのコードを自動生成しています。それほど読みにくくはないと思います。ただ、コンボ定義が無駄に長いことがよくわかるとは思います。

コンボはQMK Firemwareのマニュアル通りに書いています。
コンボに数字を割り振っているのはデバッグをやりやすくするためです。似たような文が並んでいるので、こうしないとどこが問題なのかがわかりにくいのです。

関数process_record_userが処理の本体ですが、ここも難しいことはしていません。順に
・英数モード、かなモードの切り替え(無駄なコードが残っています)
・略語
を処理しています。

関数keyboard_post_init_userは接続先のOSを調べる関数です。詳しくは検索してください。今回は必要がないので使用していません。

他キーボードからの移植なので、全体に無駄なコードが残っています。

ファイル「rules.mk」には次の2行を追加してください。
COMBO_ENABLE=yes #コンボ
OS_DETECTION_ENABLE = yes #OS判別


	// YMD21 24keys-type
	// Leia mini / LEIA4 2024
	// 
	// 1.00 2024/03/10  (QMK 0.23) bancouver40 LEIA miniから移植
	// 1.01 2024/03/12  アンダーグロー用レイヤーを追加
	// 1.02 2024/03/20  LEIA4
	// 1.03 2024/04/06  
	
	//OS判別
	#include "os_detection.h"
	
	enum leia_layers {
	  _BASE_AOS,
	  _SYMBOL_1_US,
	  _NUMBERS_US,
	  _ADJUST,
	};
	
	//  JISキーコード
	#define	JC_COLN	KC_QUOT	// :コロン
	#define	JC_LPRN	KC_ASTR	// (
	#define	JC_RPRN	KC_LPRN	// )
	#define	JC_AMPR	KC_CIRC	// &
	#define	JC_EQL	KC_UNDS	// =
	#define	JC_LBRC	KC_RBRC	// [
	#define	JC_RBRC	KC_NUHS	// ]
	#define	JC_AT	KC_LBRC	//@
	#define	JC_UNDS	LSFT(KC_INT1)	// _アンダーバー
	
	//  コンマとドットのマクロ化
	#define	US_COMMA KC_COMMA
	#define	JP_COMMA KC_COMMA
	#define	US_DOT KC_DOT
	#define	JP_DOT KC_DOT
	
	#include QMK_KEYBOARD_H
	
	const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
	
	[_BASE_AOS] = LAYOUT_ortho_6x4(			
	LT(_SYMBOL_1_US,KC_TAB),	KC_COMM,	KC_E,	KC_Y,
	LT(_NUMBERS_US,KC_SPC),	KC_DOT,	KC_I,	KC_O,
	KC_LEFT,	KC_W,	KC_A,	KC_U,
	KC_RGHT,	KC_H,	KC_T,	KC_N,
	LT(_NUMBERS_US,KC_BSPC),	KC_X,	KC_S,	KC_K,
	LT(_SYMBOL_1_US,KC_ENT),	KC_MINS,	KC_R,	KC_M
	),			
	
	[_SYMBOL_1_US] = LAYOUT_ortho_6x4(			
	KC_LNG2,	KC_J,	KC_L,	KC_Q,
	_______,	KC_LPRN,	KC_V,	KC_C,
	KC_UP,	KC_LBRC,	KC_QUES,	KC_EXLM,
	KC_DOWN,	KC_B,	KC_D,	KC_AMPR,
	_______,	KC_AT,	KC_Z,	KC_G,
	KC_LNG1,	KC_UNDS,	KC_P,	KC_F
	),			
	
	[_NUMBERS_US] = LAYOUT_ortho_6x4(			
	RGB_HUI,	RGB_HUD,	RGB_M_B,	RGB_TOG,
	KC_HASH,	KC_PPLS,	KC_PAST,	KC_PERC,
	KC_EQL,	KC_PMNS,	KC_PSLS,	KC_DLR,
	KC_P0,	KC_P1,	KC_P4,	KC_P7,
	KC_PDOT,	KC_P2,	KC_P5,	KC_P8,
	_______,	KC_P3,	KC_P6,	KC_P9
	),			
	
	[_ADJUST] = LAYOUT_ortho_6x4(			
	RGB_TOG,	_______,	_______,_______,
	RGB_HUI,	RGB_SAI,	RGB_VAI,	RGB_SPI,
	RGB_HUD,	RGB_SAD,	RGB_VAD,	RGB_SPD,
	RGB_M_SN,	RGB_M_P,	RGB_M_B,	RGB_M_R,
	RGB_M_SW,	RGB_M_K,	RGB_M_X,	RGB_M_G,
	_______,	_______,	_______,	_______
	),			
	
	};
	
	// コンボ
	//  定数の定義
	
	enum combo_events {
	C_g_001,
	C_z_002,
	C_d_003,
	C_b_004,
	C_p_005,
	C_p_006,
	C_p_007,
	C_ai_008,
	C_ei_009,
	C_ou_010,
	C_you_011,
	C_yuu_012,
	C_yuu_013,
	C_yuu_014,
	C_oi_015,
	C_ui_016,
	C_ui_017,
	C_uu_018,
	C_uu_019,
	C_ann_020,
	C_ann_021,
	C_ann_022,
	C_ann_023,
	C_ann_024,
	C_inn_025,
	C_inn_026,
	C_inn_027,
	C_inn_028,
	C_inn_029,
	C_unn_030,
	C_unn_031,
	C_unn_032,
	C_unn_033,
	C_enn_034,
	C_enn_035,
	C_enn_036,
	C_enn_037,
	C_enn_038,
	C_enn_039,
	C_onn_040,
	C_onn_041,
	C_onn_042,
	C_ya_043,
	C_ya_044,
	C_yu_045,
	C_yu_046,
	C_yu_047,
	C_yu_048,
	C_yo_049,
	C_yo_050,
	C_ye_051,
	C_ye_052,
	C_ye_053,
	C_yann_054,
	C_yonn_055,
	C_yonn_056,
	C_yunn_057,
	C_yunn_058,
	C_nn_059,
	C_xtu_060,
	C_no_061,
	C_no_062,
	C_no_063,
	C_no_064,
	C_no_065,
	C_ga_066,
	C_ga_067,
	C_ga_068,
	C_mo_069,
	C_mo_070,
	C_mo_071,
	C_mo_072,
	C_to_073,
	C_to_074,
	C_to_075,
	C_to_076,
	C_de_077,
	C_de_078,
	C_de_079,
	C_ne_080,
	C_da_081,
	C_tu_082,
	C_ha_083,
	C_ha_084,
	C_ha_085,
	C_ha_086,
	C_ni_087,
	C_ni_088,
	C_ni_089,
	C_ni_090,
	C_ni_091,
	C_he_092,
	C_wo_093,
	C_wo_094,
	C_wo_095,
	C_wo_096,
	C_wo_097,
	C_home_098,
	C_end_099,
	C_pgup_100,
	C_pgdown_101,
	C_home_102,
	C_end_103,
	C_pgup_104,
	C_pgdown_105,
	COMBO_LENGTH
	};
	
	uint16_t COMBO_LEN = COMBO_LENGTH; // remove the COMBO_COUNT define and use this instead!
	
	//  入力キーの組み合わせの定義
	const uint16_t PROGMEM g_001_combo[]={KC_K,KC_M, COMBO_END};
	const uint16_t PROGMEM z_002_combo[]={KC_S,KC_R, COMBO_END};
	const uint16_t PROGMEM d_003_combo[]={KC_T,KC_S, COMBO_END};
	const uint16_t PROGMEM b_004_combo[]={KC_H,KC_X, COMBO_END};
	const uint16_t PROGMEM p_005_combo[]={KC_R,KC_X, COMBO_END};
	const uint16_t PROGMEM p_006_combo[]={KC_R,KC_MINS, COMBO_END};
	const uint16_t PROGMEM p_007_combo[]={KC_R,KC_H, COMBO_END};
	const uint16_t PROGMEM ai_008_combo[]={KC_A,KC_I, COMBO_END};
	const uint16_t PROGMEM ei_009_combo[]={KC_E,KC_I, COMBO_END};
	const uint16_t PROGMEM ou_010_combo[]={KC_O,KC_U, COMBO_END};
	const uint16_t PROGMEM you_011_combo[]={KC_Y,KC_O, COMBO_END};
	const uint16_t PROGMEM yuu_012_combo[]={KC_Y,KC_U, COMBO_END};
	const uint16_t PROGMEM yuu_013_combo[]={KC_U,KC_C, COMBO_END};
	const uint16_t PROGMEM yuu_014_combo[]={KC_U,KC_N, COMBO_END};
	const uint16_t PROGMEM oi_015_combo[]={KC_E,KC_A, COMBO_END};
	const uint16_t PROGMEM ui_016_combo[]={KC_I,KC_V, COMBO_END};
	const uint16_t PROGMEM ui_017_combo[]={KC_I,KC_T, COMBO_END};
	const uint16_t PROGMEM uu_018_combo[]={KC_U,KC_C, COMBO_END};
	const uint16_t PROGMEM uu_019_combo[]={KC_U,KC_N, COMBO_END};
	const uint16_t PROGMEM ann_020_combo[]={KC_A,US_DOT, COMBO_END};
	const uint16_t PROGMEM ann_021_combo[]={KC_A,JP_DOT, COMBO_END};
	const uint16_t PROGMEM ann_022_combo[]={KC_A,KC_W, COMBO_END};
	const uint16_t PROGMEM ann_023_combo[]={KC_A,KC_Z, COMBO_END};
	const uint16_t PROGMEM ann_024_combo[]={KC_A,KC_H, COMBO_END};
	const uint16_t PROGMEM inn_025_combo[]={KC_I,US_COMMA, COMBO_END};
	const uint16_t PROGMEM inn_026_combo[]={KC_I,JP_COMMA, COMBO_END};
	const uint16_t PROGMEM inn_027_combo[]={KC_I,US_DOT, COMBO_END};
	const uint16_t PROGMEM inn_028_combo[]={KC_I,JP_DOT, COMBO_END};
	const uint16_t PROGMEM inn_029_combo[]={KC_I,KC_W, COMBO_END};
	const uint16_t PROGMEM unn_030_combo[]={KC_U,KC_I, COMBO_END};
	const uint16_t PROGMEM unn_031_combo[]={KC_U,KC_A, COMBO_END};
	const uint16_t PROGMEM unn_032_combo[]={KC_U,KC_V, COMBO_END};
	const uint16_t PROGMEM unn_033_combo[]={KC_U,KC_T, COMBO_END};
	const uint16_t PROGMEM enn_034_combo[]={KC_E,KC_J, COMBO_END};
	const uint16_t PROGMEM enn_035_combo[]={KC_E,US_COMMA, COMBO_END};
	const uint16_t PROGMEM enn_036_combo[]={KC_E,JP_COMMA, COMBO_END};
	const uint16_t PROGMEM enn_037_combo[]={KC_E,US_DOT, COMBO_END};
	const uint16_t PROGMEM enn_038_combo[]={KC_E,JP_DOT, COMBO_END};
	const uint16_t PROGMEM enn_039_combo[]={KC_E,KC_W, COMBO_END};
	const uint16_t PROGMEM onn_040_combo[]={KC_O,KC_E, COMBO_END};
	const uint16_t PROGMEM onn_041_combo[]={KC_O,KC_I, COMBO_END};
	const uint16_t PROGMEM onn_042_combo[]={KC_O,KC_A, COMBO_END};
	const uint16_t PROGMEM ya_043_combo[]={KC_W,US_DOT, COMBO_END};
	const uint16_t PROGMEM ya_044_combo[]={KC_W,JP_DOT, COMBO_END};
	const uint16_t PROGMEM yu_045_combo[]={KC_W,US_COMMA, COMBO_END};
	const uint16_t PROGMEM yu_046_combo[]={KC_W,JP_COMMA, COMBO_END};
	const uint16_t PROGMEM yu_047_combo[]={US_DOT,LT(_NUMBERS_US,KC_SPC), COMBO_END};
	const uint16_t PROGMEM yu_048_combo[]={JP_DOT,LT(_NUMBERS_US,KC_SPC), COMBO_END};
	const uint16_t PROGMEM yo_049_combo[]={US_COMMA,US_DOT, COMBO_END};
	const uint16_t PROGMEM yo_050_combo[]={JP_COMMA,JP_DOT, COMBO_END};
	const uint16_t PROGMEM ye_051_combo[]={KC_Y,KC_L, COMBO_END};
	const uint16_t PROGMEM ye_052_combo[]={KC_Y,KC_E, COMBO_END};
	const uint16_t PROGMEM ye_053_combo[]={KC_Y,KC_I, COMBO_END};
	const uint16_t PROGMEM yann_054_combo[]={KC_J,KC_W, COMBO_END};
	const uint16_t PROGMEM yonn_055_combo[]={KC_J,US_DOT, COMBO_END};
	const uint16_t PROGMEM yonn_056_combo[]={KC_J,JP_DOT, COMBO_END};
	const uint16_t PROGMEM yunn_057_combo[]={KC_J,US_COMMA, COMBO_END};
	const uint16_t PROGMEM yunn_058_combo[]={KC_J,JP_COMMA, COMBO_END};
	const uint16_t PROGMEM nn_059_combo[]={KC_N,KC_K, COMBO_END};
	const uint16_t PROGMEM xtu_060_combo[]={KC_X,KC_MINS, COMBO_END};
	const uint16_t PROGMEM no_061_combo[]={KC_N,KC_G, COMBO_END};
	const uint16_t PROGMEM no_062_combo[]={KC_N,KC_T, COMBO_END};
	const uint16_t PROGMEM no_063_combo[]={KC_N,KC_S, COMBO_END};
	const uint16_t PROGMEM no_064_combo[]={KC_N,KC_A, COMBO_END};
	const uint16_t PROGMEM no_065_combo[]={KC_N,KC_M, COMBO_END};
	const uint16_t PROGMEM ga_066_combo[]={KC_K,KC_T, COMBO_END};
	const uint16_t PROGMEM ga_067_combo[]={KC_K,KC_S, COMBO_END};
	const uint16_t PROGMEM ga_068_combo[]={KC_K,KC_R, COMBO_END};
	const uint16_t PROGMEM mo_069_combo[]={KC_M,KC_S, COMBO_END};
	const uint16_t PROGMEM mo_070_combo[]={KC_M,KC_R, COMBO_END};
	const uint16_t PROGMEM mo_071_combo[]={KC_M,KC_P, COMBO_END};
	const uint16_t PROGMEM mo_072_combo[]={KC_M,KC_T, COMBO_END};
	const uint16_t PROGMEM to_073_combo[]={KC_T,KC_D, COMBO_END};
	const uint16_t PROGMEM to_074_combo[]={KC_T,KC_H, COMBO_END};
	const uint16_t PROGMEM to_075_combo[]={KC_T,KC_X, COMBO_END};
	const uint16_t PROGMEM to_076_combo[]={KC_T,KC_W, COMBO_END};
	const uint16_t PROGMEM de_077_combo[]={KC_S,KC_H, COMBO_END};
	const uint16_t PROGMEM de_078_combo[]={KC_S,KC_X, COMBO_END};
	const uint16_t PROGMEM de_079_combo[]={KC_S,KC_MINS, COMBO_END};
	const uint16_t PROGMEM ne_080_combo[]={KC_N,KC_B, COMBO_END};
	const uint16_t PROGMEM da_081_combo[]={KC_T,KC_G, COMBO_END};
	const uint16_t PROGMEM tu_082_combo[]={KC_T,KC_R, COMBO_END};
	const uint16_t PROGMEM ha_083_combo[]={KC_H,KC_MINS, COMBO_END};
	const uint16_t PROGMEM ha_084_combo[]={KC_H,KC_LEFT, COMBO_END};
	const uint16_t PROGMEM ha_085_combo[]={KC_H,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM ha_086_combo[]={KC_H,LT(_NUMBERS_US,KC_BSPC), COMBO_END};
	const uint16_t PROGMEM ni_087_combo[]={KC_X,KC_W, COMBO_END};
	const uint16_t PROGMEM ni_088_combo[]={KC_X,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM ni_089_combo[]={KC_X,LT(_NUMBERS_US,KC_BSPC), COMBO_END};
	const uint16_t PROGMEM ni_090_combo[]={KC_X,LT(_SYMBOL_1_US,KC_ENT), COMBO_END};
	const uint16_t PROGMEM ni_091_combo[]={KC_X,KC_D, COMBO_END};
	const uint16_t PROGMEM he_092_combo[]={KC_H,KC_D, COMBO_END};
	const uint16_t PROGMEM wo_093_combo[]={KC_W,KC_Z, COMBO_END};
	const uint16_t PROGMEM wo_094_combo[]={KC_W,LT(_NUMBERS_US,KC_SPC), COMBO_END};
	const uint16_t PROGMEM wo_095_combo[]={KC_W,KC_LEFT, COMBO_END};
	const uint16_t PROGMEM wo_096_combo[]={KC_W,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM wo_097_combo[]={KC_W,KC_H, COMBO_END};
	const uint16_t PROGMEM home_098_combo[]={KC_Q,KC_L, COMBO_END};
	const uint16_t PROGMEM end_099_combo[]={KC_L,KC_J, COMBO_END};
	const uint16_t PROGMEM pgup_100_combo[]={KC_C,KC_V, COMBO_END};
	const uint16_t PROGMEM pgdown_101_combo[]={KC_V,KC_Z, COMBO_END};
	const uint16_t PROGMEM home_102_combo[]={KC_UP,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM end_103_combo[]={KC_DOWN,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM pgup_104_combo[]={KC_UP,KC_LEFT, COMBO_END};
	const uint16_t PROGMEM pgdown_105_combo[]={KC_DOWN,KC_LEFT, COMBO_END};
	
	combo_t key_combos[] = {
	[C_g_001] = COMBO_ACTION(g_001_combo),
	[C_z_002] = COMBO_ACTION(z_002_combo),
	[C_d_003] = COMBO_ACTION(d_003_combo),
	[C_b_004] = COMBO_ACTION(b_004_combo),
	[C_p_005] = COMBO_ACTION(p_005_combo),
	[C_p_006] = COMBO_ACTION(p_006_combo),
	[C_p_007] = COMBO_ACTION(p_007_combo),
	[C_ai_008] = COMBO_ACTION(ai_008_combo),
	[C_ei_009] = COMBO_ACTION(ei_009_combo),
	[C_ou_010] = COMBO_ACTION(ou_010_combo),
	[C_you_011] = COMBO_ACTION(you_011_combo),
	[C_yuu_012] = COMBO_ACTION(yuu_012_combo),
	[C_yuu_013] = COMBO_ACTION(yuu_013_combo),
	[C_yuu_014] = COMBO_ACTION(yuu_014_combo),
	[C_oi_015] = COMBO_ACTION(oi_015_combo),
	[C_ui_016] = COMBO_ACTION(ui_016_combo),
	[C_ui_017] = COMBO_ACTION(ui_017_combo),
	[C_uu_018] = COMBO_ACTION(uu_018_combo),
	[C_uu_019] = COMBO_ACTION(uu_019_combo),
	[C_ann_020] = COMBO_ACTION(ann_020_combo),
	[C_ann_021] = COMBO_ACTION(ann_021_combo),
	[C_ann_022] = COMBO_ACTION(ann_022_combo),
	[C_ann_023] = COMBO_ACTION(ann_023_combo),
	[C_ann_024] = COMBO_ACTION(ann_024_combo),
	[C_inn_025] = COMBO_ACTION(inn_025_combo),
	[C_inn_026] = COMBO_ACTION(inn_026_combo),
	[C_inn_027] = COMBO_ACTION(inn_027_combo),
	[C_inn_028] = COMBO_ACTION(inn_028_combo),
	[C_inn_029] = COMBO_ACTION(inn_029_combo),
	[C_unn_030] = COMBO_ACTION(unn_030_combo),
	[C_unn_031] = COMBO_ACTION(unn_031_combo),
	[C_unn_032] = COMBO_ACTION(unn_032_combo),
	[C_unn_033] = COMBO_ACTION(unn_033_combo),
	[C_enn_034] = COMBO_ACTION(enn_034_combo),
	[C_enn_035] = COMBO_ACTION(enn_035_combo),
	[C_enn_036] = COMBO_ACTION(enn_036_combo),
	[C_enn_037] = COMBO_ACTION(enn_037_combo),
	[C_enn_038] = COMBO_ACTION(enn_038_combo),
	[C_enn_039] = COMBO_ACTION(enn_039_combo),
	[C_onn_040] = COMBO_ACTION(onn_040_combo),
	[C_onn_041] = COMBO_ACTION(onn_041_combo),
	[C_onn_042] = COMBO_ACTION(onn_042_combo),
	[C_ya_043] = COMBO_ACTION(ya_043_combo),
	[C_ya_044] = COMBO_ACTION(ya_044_combo),
	[C_yu_045] = COMBO_ACTION(yu_045_combo),
	[C_yu_046] = COMBO_ACTION(yu_046_combo),
	[C_yu_047] = COMBO_ACTION(yu_047_combo),
	[C_yu_048] = COMBO_ACTION(yu_048_combo),
	[C_yo_049] = COMBO_ACTION(yo_049_combo),
	[C_yo_050] = COMBO_ACTION(yo_050_combo),
	[C_ye_051] = COMBO_ACTION(ye_051_combo),
	[C_ye_052] = COMBO_ACTION(ye_052_combo),
	[C_ye_053] = COMBO_ACTION(ye_053_combo),
	[C_yann_054] = COMBO_ACTION(yann_054_combo),
	[C_yonn_055] = COMBO_ACTION(yonn_055_combo),
	[C_yonn_056] = COMBO_ACTION(yonn_056_combo),
	[C_yunn_057] = COMBO_ACTION(yunn_057_combo),
	[C_yunn_058] = COMBO_ACTION(yunn_058_combo),
	[C_nn_059] = COMBO_ACTION(nn_059_combo),
	[C_xtu_060] = COMBO_ACTION(xtu_060_combo),
	[C_no_061] = COMBO_ACTION(no_061_combo),
	[C_no_062] = COMBO_ACTION(no_062_combo),
	[C_no_063] = COMBO_ACTION(no_063_combo),
	[C_no_064] = COMBO_ACTION(no_064_combo),
	[C_no_065] = COMBO_ACTION(no_065_combo),
	[C_ga_066] = COMBO_ACTION(ga_066_combo),
	[C_ga_067] = COMBO_ACTION(ga_067_combo),
	[C_ga_068] = COMBO_ACTION(ga_068_combo),
	[C_mo_069] = COMBO_ACTION(mo_069_combo),
	[C_mo_070] = COMBO_ACTION(mo_070_combo),
	[C_mo_071] = COMBO_ACTION(mo_071_combo),
	[C_mo_072] = COMBO_ACTION(mo_072_combo),
	[C_to_073] = COMBO_ACTION(to_073_combo),
	[C_to_074] = COMBO_ACTION(to_074_combo),
	[C_to_075] = COMBO_ACTION(to_075_combo),
	[C_to_076] = COMBO_ACTION(to_076_combo),
	[C_de_077] = COMBO_ACTION(de_077_combo),
	[C_de_078] = COMBO_ACTION(de_078_combo),
	[C_de_079] = COMBO_ACTION(de_079_combo),
	[C_ne_080] = COMBO_ACTION(ne_080_combo),
	[C_da_081] = COMBO_ACTION(da_081_combo),
	[C_tu_082] = COMBO_ACTION(tu_082_combo),
	[C_ha_083] = COMBO_ACTION(ha_083_combo),
	[C_ha_084] = COMBO_ACTION(ha_084_combo),
	[C_ha_085] = COMBO_ACTION(ha_085_combo),
	[C_ha_086] = COMBO_ACTION(ha_086_combo),
	[C_ni_087] = COMBO_ACTION(ni_087_combo),
	[C_ni_088] = COMBO_ACTION(ni_088_combo),
	[C_ni_089] = COMBO_ACTION(ni_089_combo),
	[C_ni_090] = COMBO_ACTION(ni_090_combo),
	[C_ni_091] = COMBO_ACTION(ni_091_combo),
	[C_he_092] = COMBO_ACTION(he_092_combo),
	[C_wo_093] = COMBO_ACTION(wo_093_combo),
	[C_wo_094] = COMBO_ACTION(wo_094_combo),
	[C_wo_095] = COMBO_ACTION(wo_095_combo),
	[C_wo_096] = COMBO_ACTION(wo_096_combo),
	[C_wo_097] = COMBO_ACTION(wo_097_combo),
	[C_home_098] = COMBO_ACTION(home_098_combo),
	[C_end_099] = COMBO_ACTION(end_099_combo),
	[C_pgup_100] = COMBO_ACTION(pgup_100_combo),
	[C_pgdown_101] = COMBO_ACTION(pgdown_101_combo),
	[C_home_102] = COMBO_ACTION(home_102_combo),
	[C_end_103] = COMBO_ACTION(end_103_combo),
	[C_pgup_104] = COMBO_ACTION(pgup_104_combo),
	[C_pgdown_105] = COMBO_ACTION(pgdown_105_combo),
	};
	
	//  2打鍵入力の構造体、変数
	
	struct shorten{
		uint16_t	first;  //1文字目
		uint16_t	second; //2文字目
		uint16_t	bs;   //backspaceが必要==1
		char	cont[8];  //2文字目以降
	};
	
	static struct shorten set[]={
	{KC_D,KC_H,0,"eha"},
	{KC_D,KC_K,0,"eki"},
	{KC_D,KC_M,0,"emo"},
	{KC_D,KC_R,0,"eru"},
	{KC_D,KC_S,0,"esu"},
	{KC_D,KC_T,0,"esita"},
	{KC_D,KC_MINS,0,"esyou"},
	
	{KC_G,KC_T,0,"atu"},
	{KC_G,KC_W,0,"awa"},
	
	{KC_H,KC_D,0,"odo"},
	{KC_H,KC_K,0,"oka"},
	{KC_H,KC_N,0,"unn"},
	{KC_H,KC_S,0,"asi"},
	{KC_H,KC_MINS,0,"igasi"},
	{KC_H,KC_T,0,"odo"},
	
	{KC_K,KC_N,0,"ono"},
	{KC_K,KC_R,0,"ara"},
	{KC_K,KC_S,0,"udasai"},
	{KC_K,KC_T,0,"oto"},
	{KC_K,KC_W,0,"awa"},
	{KC_K,KC_MINS,0,"ita"},
	{KC_K,KC_K,1,"getu"},
	
	{KC_M,KC_D,0,"ade"},
	{KC_M,KC_K,0,"asenn"},
	{KC_M,KC_N,0,"ono"},
	{KC_M,KC_S,0,"asu"},
	{KC_M,KC_T,0,"asita"},
	{KC_M,KC_MINS,0,"inami"},
	
	{KC_N,KC_D,0,"ado"},
	{KC_N,KC_H,0,"iha"},
	{KC_N,KC_K,0,"aka"},
	{KC_N,KC_R,0,"ar"},
	{KC_N,KC_T,0,"iti"},
	{KC_N,KC_MINS,0,"isi"},
	
	{KC_R,KC_R,0,"eru"},
	{KC_R,KC_MINS,0,"areru"},
	
	{KC_S,KC_G,0,"iki"},
	{KC_S,KC_K,0,"oko"},
	{KC_S,KC_M,0,"ama"},
	{KC_S,KC_N,0,"ono"},
	{KC_S,KC_R,0,"uru"},
	{KC_S,KC_S,0,"imasu"},
	{KC_S,KC_T,0,"ita"},
	{KC_S,KC_X,0,"imasita"},
	{KC_S,KC_MINS,0,"yunn"},
	{KC_S,KC_H,1,"zyunn"},
	{KC_S,KC_W,0,"iki"},
	
	{KC_T,KC_G,0,"ugi"},
	{KC_T,KC_H,0,"oha"},
	{KC_T,KC_K,0,"eki"},
	{KC_T,KC_M,0,"ame"},
	{KC_T,KC_R,1,"deru"},
	{KC_T,KC_S,1,"desu"},
	{KC_T,KC_T,1,"desita"},
	{KC_T,KC_MINS,1,"desyou"},
	{KC_T,KC_X,0,"ugi"},
	
	{KC_W,KC_K,0,"ake"},
	
	{KC_Y,KC_K,0,"oku"},
	{KC_Y,KC_R,0,"ori"},
	
		{0,0,0,""}
	};
	
	static uint16_t cons_on=1;  //2打鍵 on/off
	static uint16_t jp_on=1;
	static uint16_t first_on=0;
	static uint16_t i;
	
	//  コンボの処理
	void process_combo_event(uint16_t combo_index, bool pressed) {
	
	  first_on=0; //コンボを実行する時は2打鍵をリセットする
	
	switch(combo_index) {
	case C_g_001: if (pressed) {SEND_STRING("g");}break;
	case C_z_002: if (pressed) {SEND_STRING("z");}break;
	case C_d_003: if (pressed) {SEND_STRING("d");}break;
	case C_b_004: if (pressed) {SEND_STRING("b");}break;
	case C_p_005: if (pressed) {SEND_STRING("p");}break;
	case C_p_006: if (pressed) {SEND_STRING("p");}break;
	case C_p_007: if (pressed) {SEND_STRING("p");}break;
	case C_ai_008: if (pressed) {SEND_STRING("ai");}break;
	case C_ei_009: if (pressed) {SEND_STRING("ei");}break;
	case C_ou_010: if (pressed) {SEND_STRING("ou");}break;
	case C_you_011: if (pressed) {SEND_STRING("you");}break;
	case C_yuu_012: if (pressed) {SEND_STRING("yuu");}break;
	case C_yuu_013: if (pressed) {SEND_STRING("yuu");}break;
	case C_yuu_014: if (pressed) {SEND_STRING("yuu");}break;
	case C_oi_015: if (pressed) {SEND_STRING("oi");}break;
	case C_ui_016: if (pressed) {SEND_STRING("ui");}break;
	case C_ui_017: if (pressed) {SEND_STRING("ui");}break;
	case C_uu_018: if (pressed) {SEND_STRING("uu");}break;
	case C_uu_019: if (pressed) {SEND_STRING("uu");}break;
	case C_ann_020: if (pressed) {SEND_STRING("ann");}break;
	case C_ann_021: if (pressed) {SEND_STRING("ann");}break;
	case C_ann_022: if (pressed) {SEND_STRING("ann");}break;
	case C_ann_023: if (pressed) {SEND_STRING("ann");}break;
	case C_ann_024: if (pressed) {SEND_STRING("ann");}break;
	case C_inn_025: if (pressed) {SEND_STRING("inn");}break;
	case C_inn_026: if (pressed) {SEND_STRING("inn");}break;
	case C_inn_027: if (pressed) {SEND_STRING("inn");}break;
	case C_inn_028: if (pressed) {SEND_STRING("inn");}break;
	case C_inn_029: if (pressed) {SEND_STRING("inn");}break;
	case C_unn_030: if (pressed) {SEND_STRING("unn");}break;
	case C_unn_031: if (pressed) {SEND_STRING("unn");}break;
	case C_unn_032: if (pressed) {SEND_STRING("unn");}break;
	case C_unn_033: if (pressed) {SEND_STRING("unn");}break;
	case C_enn_034: if (pressed) {SEND_STRING("enn");}break;
	case C_enn_035: if (pressed) {SEND_STRING("enn");}break;
	case C_enn_036: if (pressed) {SEND_STRING("enn");}break;
	case C_enn_037: if (pressed) {SEND_STRING("enn");}break;
	case C_enn_038: if (pressed) {SEND_STRING("enn");}break;
	case C_enn_039: if (pressed) {SEND_STRING("enn");}break;
	case C_onn_040: if (pressed) {SEND_STRING("onn");}break;
	case C_onn_041: if (pressed) {SEND_STRING("onn");}break;
	case C_onn_042: if (pressed) {SEND_STRING("onn");}break;
	case C_ya_043: if (pressed) {SEND_STRING("ya");}break;
	case C_ya_044: if (pressed) {SEND_STRING("ya");}break;
	case C_yu_045: if (pressed) {SEND_STRING("yu");}break;
	case C_yu_046: if (pressed) {SEND_STRING("yu");}break;
	case C_yu_047: if (pressed) {SEND_STRING("yu");}break;
	case C_yu_048: if (pressed) {SEND_STRING("yu");}break;
	case C_yo_049: if (pressed) {SEND_STRING("yo");}break;
	case C_yo_050: if (pressed) {SEND_STRING("yo");}break;
	case C_ye_051: if (pressed) {SEND_STRING("ye");}break;
	case C_ye_052: if (pressed) {SEND_STRING("ye");}break;
	case C_ye_053: if (pressed) {SEND_STRING("ye");}break;
	case C_yann_054: if (pressed) {SEND_STRING("yann");}break;
	case C_yonn_055: if (pressed) {SEND_STRING("yonn");}break;
	case C_yonn_056: if (pressed) {SEND_STRING("yonn");}break;
	case C_yunn_057: if (pressed) {SEND_STRING("yunn");}break;
	case C_yunn_058: if (pressed) {SEND_STRING("yunn");}break;
	case C_nn_059: if (pressed) {SEND_STRING("nn");}break;
	case C_xtu_060: if (pressed) {SEND_STRING("xtu");}break;
	case C_no_061: if (pressed) {SEND_STRING("no");}break;
	case C_no_062: if (pressed) {SEND_STRING("no");}break;
	case C_no_063: if (pressed) {SEND_STRING("no");}break;
	case C_no_064: if (pressed) {SEND_STRING("no");}break;
	case C_no_065: if (pressed) {SEND_STRING("no");}break;
	case C_ga_066: if (pressed) {SEND_STRING("ga");}break;
	case C_ga_067: if (pressed) {SEND_STRING("ga");}break;
	case C_ga_068: if (pressed) {SEND_STRING("ga");}break;
	case C_mo_069: if (pressed) {SEND_STRING("mo");}break;
	case C_mo_070: if (pressed) {SEND_STRING("mo");}break;
	case C_mo_071: if (pressed) {SEND_STRING("mo");}break;
	case C_mo_072: if (pressed) {SEND_STRING("mo");}break;
	case C_to_073: if (pressed) {SEND_STRING("to");}break;
	case C_to_074: if (pressed) {SEND_STRING("to");}break;
	case C_to_075: if (pressed) {SEND_STRING("to");}break;
	case C_to_076: if (pressed) {SEND_STRING("to");}break;
	case C_de_077: if (pressed) {SEND_STRING("de");}break;
	case C_de_078: if (pressed) {SEND_STRING("de");}break;
	case C_de_079: if (pressed) {SEND_STRING("de");}break;
	case C_ne_080: if (pressed) {SEND_STRING("ne");}break;
	case C_da_081: if (pressed) {SEND_STRING("da");}break;
	case C_tu_082: if (pressed) {SEND_STRING("tu");}break;
	case C_ha_083: if (pressed) {SEND_STRING("ha");}break;
	case C_ha_084: if (pressed) {SEND_STRING("ha");}break;
	case C_ha_085: if (pressed) {SEND_STRING("ha");}break;
	case C_ha_086: if (pressed) {SEND_STRING("ha");}break;
	case C_ni_087: if (pressed) {SEND_STRING("ni");}break;
	case C_ni_088: if (pressed) {SEND_STRING("ni");}break;
	case C_ni_089: if (pressed) {SEND_STRING("ni");}break;
	case C_ni_090: if (pressed) {SEND_STRING("ni");}break;
	case C_ni_091: if (pressed) {SEND_STRING("ni");}break;
	case C_he_092: if (pressed) {SEND_STRING("he");}break;
	case C_wo_093: if (pressed) {SEND_STRING("wo");}break;
	case C_wo_094: if (pressed) {SEND_STRING("wo");}break;
	case C_wo_095: if (pressed) {SEND_STRING("wo");}break;
	case C_wo_096: if (pressed) {SEND_STRING("wo");}break;
	case C_wo_097: if (pressed) {SEND_STRING("wo");}break;
	case C_home_098: if (pressed) {tap_code16(KC_HOME);}break;
	case C_end_099: if (pressed) {tap_code16(KC_END);}break;
	case C_pgup_100: if (pressed) {tap_code16(KC_PGUP);}break;
	case C_pgdown_101: if (pressed) {tap_code16(KC_PGDN);}break;
	case C_home_102: if (pressed) {tap_code16(KC_HOME);}break;
	case C_end_103: if (pressed) {tap_code16(KC_END);}break;
	case C_pgup_104: if (pressed) {tap_code16(KC_PGUP);}break;
	case C_pgdown_105: if (pressed) {tap_code16(KC_PGDN);}break;
	}
	}
	
	//  接続時にOSの判別
	void keyboard_post_init_user(void){
	  wait_ms(400);
	  //switch (detected_host_os()) {
	  //  case OS_WINDOWS:
	  //    layer_move(_BASE_WIN);
	  //    break;
	  //  case OS_MACOS:
	  //  case OS_IOS:
	  //    layer_move(_BASE_MAC);
	  //    break;
	  //  case OS_LINUX:
	  //    layer_move(_BASE_WIN);
	  //    break;
	  //  default:
	  //  layer_move(_BASE_AOS);
	  //}
	}
	
	//  分岐と文字列出力
	
	bool process_record_user(uint16_t keycode, keyrecord_t *record) {
	
	   switch (keycode) {
	
		//かな・英数の切り替え いろいろなcaseを用意しているが、不要ならコメントアウトして良い
		case KC_LNG2:  //Mac、Windows英数モードKC_LANG2 record->event.pressedでないとうまくいかない?
		case LALT_T(KC_LNG2):  //Mac英数モード optionキーと兼用
		case LSFT_T(KC_LNG2):  //Mac英数モード shiftキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG2);//key down
			jp_on=0;
			first_on=0;
			return false;
		   } else {
			return true;
		   }
		   break;
		case KC_CAPS:  //Win英数モード
		//case KC_MHEN:  //Win英数モード
		case LALT_T(KC_CAPS):  //Win英数モード altキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG2);//key down
			//tap_code16(KC_CAPS);//古いWindowsの場合
			jp_on=0;
			first_on=0;
			return false;
		   } else {
			return true;
		   }
		   break;
		case LALT_T(KC_HOME):  //Android英数モード 意味のないキーを割り当てている
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			//key downは無視
			jp_on=0;
			first_on=0;
			return false;
		   } else {
			return true;
		   }
		   break;
		case KC_LNG1: //Mac、WindowsかなモードKC_LANG1
		case LCTL_T(KC_LNG1): //Macかなモード ctrlキーと兼用
		case LGUI_T(KC_LNG1): //Macかなモード commandキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG1);//key down
			jp_on=1;
			first_on=0;
			  return false;
			} else {
			  return true;
			}
			break;
		case KC_GRV:  //Winかなモード
		//case KC_HENK:  //Winかなモード
		case LGUI_T(KC_GRV):  //Winかなモード guiキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG1);//key down
			//tap_code16(KC_GRV);//古いWindowsの場合
			//tap_code16(KC_HENK);//別の定義
			jp_on=1;
			first_on=0;
			return false;
		  } else {
			return true;
		  }
		  break;
		case LGUI_T(KC_END):  //Androidかなモード 意味のないキーを割り当てている
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			//key downは無視
			jp_on=1;
			first_on=0;
			return false;
		  } else {
			return true;
		  }
		  break;
		//default:
	   }
	
	 
	  //  かなモードの時、2打鍵処理
	  if (jp_on==1 && cons_on==1) {
		switch (keycode) {
	
		  //括弧
		  case KC_LPRN:
			if (record->event.pressed) {
			  SEND_STRING("()");  //key downn
			} else {
			  //key up
			}
			return false;//キー動作を上書き
		  case KC_LBRC:
			if (record->event.pressed) {
			  SEND_STRING("[]");  //key downn
			} else {
			  //key up
			}
			return false;//キー動作を上書き
		} 
	
		//2打鍵入力
		if (first_on==0) {  //1打目の処理
		  switch (keycode) {
			case KC_D:
			case KC_G:
			case KC_H:
			case KC_K:
			case KC_M:
			case KC_N:
			case KC_R:
			case KC_S: 
			case KC_T: 
			case KC_W: 
			case KC_X: 
			case KC_Y: 
			case KC_Z: 
			  if (record->event.pressed) {
				register_code(keycode);  //key downn
			  } else {
				unregister_code(keycode); //key up ここでフラグをセット
				first_on=keycode; //1打目のキーコードを記録
			  }
			  return false;;//キー動作を上書き
			  break;
		  } 
		} else {  //2打目の処理
		  i=0;
		  while(set[i].first != 0){
			  if(first_on==set[i].first && keycode==set[i].second) {
			  if (record->event.pressed) {
				if (set[i].bs==1) {
				  tap_code(KC_BSPC); //1文字目を削除
				}
				  send_string(set[i].cont);  //key downで残りの文字列を出力
				} else {
					  first_on=0; //key upの時にフラグをリセット
				  }
				  return false;
			  };
			i++;
		  };
	
		  first_on=0;//どれにも当てはまらなければ強制的に1文字目に戻す
		  return true;
		}
	
	  } else {//英数モードの時は何もしない
		if (record->event.pressed) {
		  } else {
		   // when keycode is released
		  }
	  }
	  return true;
	};
	


[TTTキーボード研究室 TOP] [東京タヌキ探検隊! TOP]