Skip to content

Instantly share code, notes, and snippets.

@geekhunger
Created June 2, 2022 07:58
Show Gist options
  • Save geekhunger/8105aaf56da8b178c90a71087e40f13b to your computer and use it in GitHub Desktop.
Save geekhunger/8105aaf56da8b178c90a71087e40f13b to your computer and use it in GitHub Desktop.
Kinesis Advantage2 Keymap (kint36 fork by Geekhunger)
#pragma once
#define TAPPING_TERM 100 // I'm mainly using this for modifiers, etc
#define KEY_TAP_TIMEOUT 190 // same meaning as TAPPING_TERM but for the rest of the regular keys (KC_A ... KC_Z)
#define PREVENT_STUCK_MODIFIERS
//#define STM32_SYSCLK KINETIS_SYSCLK_FREQUENCY
//#define NOP_FUDGE 0.4
//#define RGB_DI_PIN LINE_PIN28
//#define RGBLED_NUM 4
//#define RGBLIGHT_ANIMATIONS
// Keymap for Kinesis Advantage2 (KB600) QWERTZ layout DE german
// Designed to run on MacOS/iPadOS/iOS and Windows
// Please, set system keyboard language to German!
#include QMK_KEYBOARD_H
// TODO use "keymap_german.h" to avoid manual key swapping from english to german layout
// but this header is made to work on windows, so it needs to be extended to work on mac
enum keyboard_layer {
MACOS,
WINDOWS,
NUMPAD,
};
enum custom_keycode {
MAC = SAFE_RANGE,
WIN
};
// IMPORTANT NOTE!!!
// I messed up my wiring because I suck at electronics and now my fn keys are swapped^^
// I swap them to right positions in software, see down below...
// ESC F1 F2 F3 F4 F5 F6 F7 F8
// | X | X | X
// ESC F2 F1 F3 F5 F4 F6 F8 F7
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[MACOS] = LAYOUT(
// left keywell
XXXXXXX, KC_F2, KC_F1, KC_F3, KC_F5, KC_F4, KC_F6, KC_F8, KC_F7,
XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5,
XXXXXXX, XXXXXXX, TD(KC_W), TD(KC_E), TD(KC_R), TD(KC_F),
XXXXXXX, TD(KC_A), TD(KC_S), TD(KC_D), TD(KC_T), TD(KC_G),
XXXXXXX, TD(KC_Z), TD(KC_X), TD(KC_C), TD(KC_V), TD(KC_B),
XXXXXXX, XXXXXXX, XXXXXXX, KC_LGUI,
// left thumb
LALT_T(KC_DELETE), XXXXXXX,
KC_LCTRL,
KC_SPACE, LSFT_T(KC_TAB), KC_LGUI,
// right keywell
KC_F9, KC_F10, KC_F11, KC_F12, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, XXXXXXX, RESET,
KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS,
TD(KC_Y), TD(KC_U), TD(KC_I), TD(KC_O), XXXXXXX, XXXXXXX,
TD(KC_H), TD(KC_N), TD(KC_K), TD(KC_L), TD(KC_P), XXXXXXX,
TD(KC_J), TD(KC_M), TD(KC_COMMA), TD(KC_DOT), TD(KC_SLASH), XXXXXXX,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,
// right thumb
XXXXXXX, LALT_T(KC_BSPACE),
XXXXXXX,
LGUI_T(KC_ESCAPE), RSFT_T(KC_ENTER), MO(NUMPAD)
),
[WINDOWS] = LAYOUT(
// left keywell
_______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_LALT,
// left thumb
RALT_T(KC_DELETE), KC_LALT,
KC_LGUI,
_______, _______, KC_LCTRL,
// right keywell
_______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______,
// right thumb
_______, RALT_T(KC_BSPACE),
_______,
LCTL_T(KC_ESCAPE), _______, _______
),
[NUMPAD] = LAYOUT(
// left keywell
TG(WINDOWS), KC_BRIGHTNESS_UP, KC_BRIGHTNESS_DOWN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// left thumb
XXXXXXX, XXXXXXX,
_______,
_______, XXXXXXX, _______,
// right keywell
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,
XXXXXXX, XXXXXXX, KC_COMMA, KC_DOT, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// right thumb
XXXXXXX, KC_BSPACE,
XXXXXXX,
XXXXXXX, KC_RSHIFT, _______
),
};
#define min(a, b) ((a < b) ? a : b)
#define max(a, b) ((a > b) ? a : b)
#define is_win(void) layer_state_is(WINDOWS)
#define is_mac(void) !is_win()
bool real_mods_have(uint8_t mask) {return (get_mods() & mask) != 0;};
bool weak_mods_have(uint8_t mask) {return (get_weak_mods() & mask) != 0;};
bool has_mods(uint8_t mask) {return (weak_mods_have(mask) || real_mods_have(mask));};
// for modifier masks see https://github.com/vomindoraan/qmk_firmware/blob/master/tmk_core/common/keycode.h
#define without_mods(mask, ...) { \
const uint8_t _real = get_mods(); \
const uint8_t _weak = get_weak_mods(); \
if(_real & mask) unregister_mods(mask); \
if(_weak & mask) unregister_weak_mods(mask); \
{__VA_ARGS__} \
set_mods(_real); \
set_weak_mods(_weak); \
}
#define with_numlock(...) { \
tap_code16(KC_NUMLOCK); \
{__VA_ARGS__} \
tap_code16(KC_NUMLOCK); \
}
#define key_report(loops, ...) { \
for(uint8_t n = 1; n <= loops; n++) { \
{__VA_ARGS__} \
} \
}
void key_pass(qk_tap_dance_state_t *state) {
if((is_mac() && has_mods(MOD_MASK_GUI)) || (is_win() && has_mods(MOD_MASK_CTRL))) {
tap_code(state->keycode); // tap key only once for OS commands
} else {
key_report(state->count, {
tap_code(state->keycode);
});
}
};
bool key_up(qk_tap_dance_state_t *state) {return state->interrupted || !state->pressed;};
bool key_down(qk_tap_dance_state_t *state) {return state->pressed && !state->interrupted;};
void w(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void e(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) { // action resolved but key still being held
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) {
tap_code16(LSFT(LALT(KC_Q))); // »
} else if(is_win()) {
// for available codes see https://wintipps.com/tastenkombination-sonderzeichen/
register_code(KC_LALT);
tap_code(KC_KP_1);
tap_code(KC_KP_7);
tap_code(KC_KP_5);
unregister_code(KC_LALT);
}
});
return;
}
}
if(has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG)) { // shift or alt pressed (but gui or ctrl are NOT present)
if(has_mods(MOD_MASK_SHIFT)) { // shift is present
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
} else { // alt is present
without_mods(MOD_MASK_ALT, {
tap_code16(LCA(KC_E)); // €
});
}
return;
}
key_pass(state);
};
void r(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG)) { // shift or alt pressed
if(has_mods(MOD_MASK_SHIFT)) { // shift is present
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
} else { // alt is present
without_mods(MOD_MASK_SA, {
if(is_mac()) {
tap_code16(LALT(KC_R)); // ®
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_1);
tap_code(KC_KP_6);
tap_code(KC_KP_9);
unregister_code(KC_LALT);
}
});
}
return;
}
key_pass(state);
};
void f(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) tap_code16(LALT(KC_8)); // {
else if(is_win()) tap_code16(ALGR(KC_7));
});
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void a(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_ALT, {
tap_code(KC_QUOTE); // ä
});
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) { // alt but no shift pressed (ctrl or gui may be present)
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code(KC_KP_PLUS); // numpad plus (+)
});
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) { // alt+shift but no ctrl or gui
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void s(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || !has_mods(MOD_MASK_CG)) { // no mods or combination of alt and shift
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
tap_code16(LSFT(KC_4)); // $
});
} else if(has_mods(MOD_MASK_ALT)) {
without_mods(MOD_MASK_ALT, {
tap_code16(LSFT(KC_3)); // §
});
} else {
tap_code(KC_MINUS); // ß
}
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code(KC_KP_MINUS); // numpad minus (-)
});
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void d(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || !has_mods(MOD_MASK_CG)) { // no mods or combination of alt and shift
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) {
tap_code16(LALT(KC_7)); // back slash
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_9);
tap_code(KC_KP_2);
unregister_code(KC_LALT);
}
});
} else if(has_mods(MOD_MASK_ALT)) {
without_mods(MOD_MASK_SA, {
key_report(state->count, {
if(is_mac()) {
tap_code16(LALT(KC_7)); // pipe
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_1);
tap_code(KC_KP_2);
tap_code(KC_KP_4);
unregister_code(KC_LALT);
}
});
});
} else {
key_report(state->count, {
tap_code16(LSFT(KC_7)); // forward slash
});
}
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code(KC_KP_SLASH); // numpad devide (/)
});
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void t(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || !has_mods(MOD_MASK_CG)) { // no mods or combination of alt and shift
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_SA, {
tap_code16(LSFT(KC_BSLASH)); // '
});
} else {
without_mods(MOD_MASK_ALT, {
tap_code16(LSFT(KC_2)); // "
});
}
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) {
tap_code16(LSFT(LALT(KC_D))); // ™
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_0);
tap_code(KC_KP_1);
tap_code(KC_KP_5);
tap_code(KC_KP_3);
unregister_code(KC_LALT);
}
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void g(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || !has_mods(MOD_MASK_CG)) { // no mods or combination of alt and shift
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_SA, {
if(is_mac()) tap_code16(LALT(KC_5)); // [
else if(is_win()) tap_code16(ALGR(KC_8));
});
} else {
without_mods(MOD_MASK_ALT, {
tap_code16(LSFT(KC_8)); // (
});
}
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) {
tap_code16(LSFT(KC_NONUS_BSLASH)); // °
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_2);
tap_code(KC_KP_4);
tap_code(KC_KP_8);
unregister_code(KC_LALT);
}
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void z(qk_tap_dance_state_t *state, void *user_data) { // german y
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void x(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void c(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || !has_mods(MOD_MASK_CG)) { // no mods or combination of alt and shift
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_SA, {
tap_code(KC_EQUAL); // ´
});
} else {
without_mods(MOD_MASK_SA, {
tap_code16(LSFT(KC_EQUAL)); // `
});
}
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) {
tap_code16(LALT(KC_G)); // ©
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_1);
tap_code(KC_KP_8);
tap_code(KC_KP_4);
unregister_code(KC_LALT);
}
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void v(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_SA, {
if(is_mac()) {
tap_code16(LSFT(LALT(KC_E))); // ‰
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_0);
tap_code(KC_KP_1);
tap_code(KC_KP_3);
tap_code(KC_KP_7);
unregister_code(KC_LALT);
}
});
return;
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void b(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || !has_mods(MOD_MASK_CG)) { // no mods or combination of alt and shift
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_SA, {
key_report(min(2, state->count), {
if(is_mac()) tap_code(KC_NONUS_BSLASH); // ^
else if(is_win()) tap_code(KC_GRAVE);
});
});
} else {
without_mods(MOD_MASK_ALT, {
if(is_mac()) tap_code(KC_GRAVE); // <
else if(is_win()) tap_code(KC_NONUS_BSLASH);
});
}
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void y(qk_tap_dance_state_t *state, void *user_data) { // geman z
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) tap_code16(LALT(KC_9)); // {
else if(is_win()) tap_code16(ALGR(KC_0));
});
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void u(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_ALT, {
tap_code(KC_LBRACKET); // ü
});
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) {
tap_code16(LALT(KC_U)); // umlaut (¨)
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_0);
tap_code(KC_KP_1);
tap_code(KC_KP_6);
tap_code(KC_KP_8);
unregister_code(KC_LALT);
}
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void i(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) {
tap_code16(LALT(KC_Q)); // «
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_1);
tap_code(KC_KP_7);
tap_code(KC_KP_4);
unregister_code(KC_LALT);
}
});
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void o(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_ALT, {
tap_code(KC_SCOLON); // ö
});
return;
}
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) {
tap_code16(LSFT(LALT(KC_O))); // Ø
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_1);
tap_code(KC_KP_5);
tap_code(KC_KP_5);
unregister_code(KC_LALT);
}
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void h(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || !has_mods(MOD_MASK_CG)) { // no mods or combination of alt and shift
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_SA, {
if(is_mac()) tap_code16(LALT(KC_6)); // ]
else if(is_win()) tap_code16(ALGR(KC_9));
});
} else {
without_mods(MOD_MASK_ALT, {
tap_code16(LSFT(KC_9)); // )
});
}
return;
}
}
if(is_win() && has_mods(MOD_MASK_CTRL) && !has_mods(MOD_MASK_SAG)) { // ctrl + h keybinding
without_mods(MOD_MASK_CSAG, {
tap_code16(LGUI(KC_DOWN)); // send Win + Arrow Down to emulate Cmd + H on MacOS
});
return;
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code(KC_BSLASH); // #
});
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void n(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) tap_code16(LALT(KC_N)); // ~
else if(is_win()) tap_code16(ALGR(KC_RBRACKET));
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void k(qk_tap_dance_state_t *state, void *user_data) { // also q key
if(key_down(state)) {
if(is_win() && has_mods(MOD_MASK_CTRL) && !has_mods(MOD_MASK_SAG)) { // ctrl + q keybinding
without_mods(MOD_MASK_CSAG, {
tap_code16(LALT(KC_F4)); // send Alt+F4 to emulate Cmd + Q on MacOS
});
return;
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_CG)) { // alt pressed (additionally shift might be present)
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code(KC_Q); // Q key
});
});
return;
}
key_report(state->count, {
tap_code(KC_Q);
});
return;
}
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code16(LSFT(KC_0)); // =
});
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void l(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) tap_code16(LALT(KC_L)); // @
else if(is_win()) tap_code16(ALGR(KC_Q));
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void p(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) {
tap_code16(LALT(KC_P)); // π
} else if(is_win()) {
register_code(KC_LALT); // this unicode does not work on all windows apps (e.g. notepad cant, but word does well)
tap_code(KC_KP_9);
tap_code(KC_KP_6);
tap_code(KC_KP_0);
unregister_code(KC_LALT);
}
});
return;
}
}
if(has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG)) {
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
} else {
without_mods(MOD_MASK_ALT, {
tap_code16(LSFT(KC_5)); // %
});
}
return;
}
key_pass(state);
};
void j(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) tap_code16(LSFT(KC_GRAVE)); // >
else if(is_win()) tap_code16(LSFT(KC_NONUS_BSLASH));
});
return;
}
}
if(has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG)) {
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
} else {
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code16(LSFT(KC_6)); // &
});
});
}
return;
}
key_pass(state);
};
void m(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) {
tap_code16(LALT(KC_M)); // µ
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_2);
tap_code(KC_KP_3);
tap_code(KC_KP_0);
unregister_code(KC_LALT);
}
});
return;
}
}
if(has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG)) {
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
} else {
without_mods(MOD_MASK_ALT, {
key_report(state->count, {
tap_code(KC_KP_ASTERISK); // numpad multiply (*)
});
});
}
return;
}
key_pass(state);
};
void comma(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_CSAG, {
key_report(state->count, {
tap_code16(LSFT(KC_MINUS)); // ?
});
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
void dot(qk_tap_dance_state_t *state, void *user_data) {
if(key_down(state)) {
if(!has_mods(MOD_MASK_CSAG) || (has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG))) {
without_mods(MOD_MASK_SA, {
if(is_mac()) {
tap_code16(LALT(KC_DOT)); // …
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_0);
tap_code(KC_KP_1);
tap_code(KC_KP_3);
tap_code(KC_KP_3);
unregister_code(KC_LALT);
}
});
return;
}
}
if(has_mods(MOD_MASK_SA) && !has_mods(MOD_MASK_CG)) {
if(has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
} else {
without_mods(MOD_MASK_CSAG, {
key_report(state->count, {
tap_code16(LSFT(KC_1)); // !
});
});
}
return;
}
key_pass(state);
};
void slash(qk_tap_dance_state_t *state, void *user_data) {
if(has_mods(MOD_MASK_ALT) && !has_mods(MOD_MASK_SHIFT)) {
without_mods(MOD_MASK_ALT, {
if(is_mac()) {
tap_code16(LALT(KC_SLASH)); // hyphen (–)
} else if(is_win()) {
register_code(KC_LALT);
tap_code(KC_KP_4);
tap_code(KC_KP_5);
unregister_code(KC_LALT);
}
});
return;
}
if(has_mods(MOD_MASK_ALT) && has_mods(MOD_MASK_SHIFT) && !has_mods(MOD_MASK_CG)) {
without_mods(MOD_MASK_ALT, {
key_pass(state);
});
return;
}
key_pass(state);
};
qk_tap_dance_action_t tap_dance_actions[] = {
[KC_W] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, w, NULL, KEY_TAP_TIMEOUT),
[KC_E] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, e, NULL, KEY_TAP_TIMEOUT),
[KC_R] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, r, NULL, KEY_TAP_TIMEOUT),
[KC_F] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, f, NULL, KEY_TAP_TIMEOUT),
[KC_A] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, a, NULL, KEY_TAP_TIMEOUT),
[KC_S] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, s, NULL, KEY_TAP_TIMEOUT),
[KC_D] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, d, NULL, KEY_TAP_TIMEOUT),
[KC_T] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, t, NULL, KEY_TAP_TIMEOUT),
[KC_G] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, g, NULL, KEY_TAP_TIMEOUT),
[KC_Z] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, z, NULL, KEY_TAP_TIMEOUT), // german y
[KC_X] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, x, NULL, KEY_TAP_TIMEOUT),
[KC_C] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, c, NULL, KEY_TAP_TIMEOUT),
[KC_V] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, v, NULL, KEY_TAP_TIMEOUT),
[KC_B] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, b, NULL, KEY_TAP_TIMEOUT),
[KC_Y] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, y, NULL, KEY_TAP_TIMEOUT), // german z
[KC_U] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, u, NULL, KEY_TAP_TIMEOUT),
[KC_I] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, i, NULL, KEY_TAP_TIMEOUT),
[KC_O] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, o, NULL, KEY_TAP_TIMEOUT),
[KC_H] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, h, NULL, KEY_TAP_TIMEOUT),
[KC_N] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, n, NULL, KEY_TAP_TIMEOUT),
[KC_K] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, k, NULL, KEY_TAP_TIMEOUT),
[KC_L] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, l, NULL, KEY_TAP_TIMEOUT),
[KC_P] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, p, NULL, KEY_TAP_TIMEOUT),
[KC_J] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, j, NULL, KEY_TAP_TIMEOUT),
[KC_M] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, m, NULL, KEY_TAP_TIMEOUT),
[KC_COMMA] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, comma, NULL, KEY_TAP_TIMEOUT),
[KC_DOT] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, dot, NULL, KEY_TAP_TIMEOUT),
[KC_SLASH] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, slash, NULL, KEY_TAP_TIMEOUT),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if(is_win() && record->event.pressed && !has_mods(MOD_MASK_AG) && has_mods(MOD_MASK_CTRL)) {
switch(keycode) {
case KC_LEFT:
without_mods(MOD_MASK_CTRL, {
tap_code(KC_HOME); // jump to beginning of line or file
});
return false;
case KC_UP:
without_mods(MOD_MASK_CTRL, {
tap_code16(LCTL(KC_HOME)); // KC_PGUP
});
return false;
case KC_RIGHT:
without_mods(MOD_MASK_CTRL, {
tap_code(KC_END); // jump to end of line or file
});
return false;
case KC_DOWN:
without_mods(MOD_MASK_CTRL, {
tap_code16(LCTL(KC_END)); // KC_PGDOWN
});
return false;
case RALT_T(KC_DELETE):
case KC_DELETE:
without_mods(MOD_MASK_CS, {
tap_code16(LSFT(KC_END)); // select everything to the right
tap_code(KC_DELETE);
});
return false;
case RALT_T(KC_BSPACE):
case KC_BSPACE:
without_mods(MOD_MASK_CS, {
tap_code16(LSFT(KC_HOME)); // select everything to the left
tap_code(KC_BSPACE);
});
return false;
}
}
if(is_win() && record->event.pressed && !has_mods(MOD_MASK_CSG) && has_mods(MOD_MASK_ALT)) {
switch(keycode) {
case KC_LEFT:
without_mods(MOD_MASK_ALT, {
tap_code16(LCTL(KC_LEFT)); // jump over word to the left
});
return false;
case KC_RIGHT:
without_mods(MOD_MASK_ALT, {
tap_code16(LCTL(KC_RIGHT)); // jump over word to the right
});
return false;
case RALT_T(KC_DELETE):
case KC_DELETE:
without_mods(MOD_MASK_ALT, {
tap_code16(LCTL(KC_DELETE)); // delete word to the right
});
return false;
case RALT_T(KC_BSPACE):
case KC_BSPACE:
without_mods(MOD_MASK_ALT, {
tap_code16(LCTL(KC_BSPACE)); // delete word to the left
});
return false;
}
}
return true;
};
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
LEADER_ENABLE = no # vim-like command chaining
TAP_DANCE_ENABLE = yes # tap and hold based key actions
@geekhunger
Copy link
Author

geekhunger commented Jun 2, 2022

So sieht mein geforktes Projektsetup aus:

Bildschirmfoto 2022-06-02 um 09 56 10

Hier ist meine kompilierte HEX Firmware:
https://www.dropbox.com/s/ml5fsccjr95di6g/kinesis_adv2_kint36_herrsch_firmware.zip

Achtung: Wie in meinem Youtube Video erklärt, hatte ich meine Boards beim Löten gegrillt und musste somit dann Workarounds machen. Im Zuge dessen habe ich jedoch einige Tasten/Kabel falsch herum eingelötet. Daher sind diese in meinem Keymap dann diese wieder zurückgemappt worden, damit alles am Ende richtig herum funktioniert. - Daher bringt die kompilierte Datei eigentlich herzlich wenig. Stattdessen, bitte oben den Code kopieren und nach Bedarf anpassen. Dann eigene Firmware kompilieren.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment