mirror of
https://github.com/qmk/qmk_userspace.git
synced 2025-11-03 10:20:07 -05:00
Refactor OS4A et CapsList
This commit is contained in:
parent
29076f534d
commit
c7214feb75
19 changed files with 231 additions and 196 deletions
|
|
@ -19,19 +19,19 @@
|
|||
#include "clever_keys.h"
|
||||
|
||||
|
||||
void get_clever_keycode(uint16_t* next_keycode, keyrecord_t* record) {
|
||||
void get_clever_keycode(uint16_t* ongoing_keycode, keyrecord_t* record) {
|
||||
|
||||
uint16_t prev_keycode = recent[RECENT_SIZE - 1];
|
||||
uint16_t prev_keycode = get_recent_keycode(-1);
|
||||
|
||||
// Apostrophe
|
||||
if (is_followed_by_apos(*next_keycode, prev_keycode)) {
|
||||
if (is_followed_by_apos(*ongoing_keycode, prev_keycode)) {
|
||||
set_last_keycode(PG_APOS);
|
||||
}
|
||||
|
||||
switch (prev_keycode) {
|
||||
|
||||
case NNB_SPC:
|
||||
switch (*next_keycode) {
|
||||
switch (*ongoing_keycode) {
|
||||
// Shift auto de la ponctuation après une espace fine insécable
|
||||
case PG_POIN:
|
||||
// uses less space than process_word
|
||||
|
|
@ -39,19 +39,18 @@ void get_clever_keycode(uint16_t* next_keycode, keyrecord_t* record) {
|
|||
process_key(SAGR(KC_SPC), record);
|
||||
case PG_TIRE:
|
||||
case PG_VIRG:
|
||||
return replace_ongoing_key(S(*next_keycode), next_keycode, record);
|
||||
return replace_ongoing_key(S(*ongoing_keycode), ongoing_keycode, record);
|
||||
}
|
||||
break;
|
||||
|
||||
case KC_SPC:
|
||||
switch (recent[RECENT_SIZE - 2]) {
|
||||
switch (get_recent_keycode(-2)) {
|
||||
case PG_EXCL:
|
||||
case PG_QUES:
|
||||
case PG_3PTS:
|
||||
case PG_POIN:
|
||||
// Shift the letter at the beginning of sentences.
|
||||
if (is_letter(*next_keycode) || is_send_string_macro(*next_keycode)) {
|
||||
//if (!is_caps_lock_on()) { add_weak_mods(MOD_BIT(KC_LSFT)); }
|
||||
if (is_letter(*ongoing_keycode) || is_send_string_macro(*ongoing_keycode)) {
|
||||
set_oneshot_mods(MOD_BIT(KC_LSFT)); // Don't use weak mods !
|
||||
}
|
||||
break;
|
||||
|
|
@ -59,7 +58,7 @@ void get_clever_keycode(uint16_t* next_keycode, keyrecord_t* record) {
|
|||
break;
|
||||
|
||||
case PG_Q:
|
||||
switch (*next_keycode) {
|
||||
switch (*ongoing_keycode) {
|
||||
|
||||
// Ajout automatique du "u" après le "q"
|
||||
case PG_E:
|
||||
|
|
@ -69,39 +68,39 @@ void get_clever_keycode(uint16_t* next_keycode, keyrecord_t* record) {
|
|||
case PG_EACU:
|
||||
case PG_APOS:
|
||||
invoke_key(PG_U, record);
|
||||
set_last_keycode(*next_keycode);
|
||||
set_last_keycode(*ongoing_keycode);
|
||||
break;
|
||||
|
||||
// Raccourci pour "quoi"
|
||||
case PG_H:
|
||||
finish_word((uint16_t[]) {PG_U, PG_O, PG_I}, 3, next_keycode, record);
|
||||
finish_word((uint16_t[]) {PG_U, PG_O, PG_I}, 3, ongoing_keycode, record);
|
||||
break;
|
||||
|
||||
// Raccourci pour "quand"
|
||||
case PG_N:
|
||||
return finish_word((uint16_t[]) {PG_U, PG_A, PG_N, PG_D}, 4, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_U, PG_A, PG_N, PG_D}, 4, ongoing_keycode, record);
|
||||
}
|
||||
break;
|
||||
|
||||
case PG_P:
|
||||
switch (*next_keycode) {
|
||||
switch (*ongoing_keycode) {
|
||||
case PG_C:
|
||||
// "pas"
|
||||
return finish_word((uint16_t[]) {PG_A, PG_S}, 2, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_A, PG_S}, 2, ongoing_keycode, record);
|
||||
|
||||
case PG_J:
|
||||
// "pour"
|
||||
return finish_word((uint16_t[]) {PG_O, PG_U, PG_R}, 3, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_O, PG_U, PG_R}, 3, ongoing_keycode, record);
|
||||
|
||||
case PG_X:
|
||||
// "plus"
|
||||
return finish_word((uint16_t[]) {PG_L, PG_U, PG_S}, 3, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_L, PG_U, PG_S}, 3, ongoing_keycode, record);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
switch (*next_keycode) {
|
||||
switch (*ongoing_keycode) {
|
||||
|
||||
case MAGIC:
|
||||
switch (prev_keycode) {
|
||||
|
|
@ -110,91 +109,91 @@ void get_clever_keycode(uint16_t* next_keycode, keyrecord_t* record) {
|
|||
process_key(PG_U, record);
|
||||
case PG_U:
|
||||
// ui SFB
|
||||
return replace_ongoing_key(PG_I, next_keycode, record);
|
||||
return replace_ongoing_key(PG_I, ongoing_keycode, record);
|
||||
|
||||
case PG_EACU:
|
||||
// éa SFB
|
||||
return replace_ongoing_key(PG_A, next_keycode, record);
|
||||
return replace_ongoing_key(PG_A, ongoing_keycode, record);
|
||||
|
||||
case PG_S:
|
||||
// sc SFB
|
||||
return replace_ongoing_key(PG_C, next_keycode, record);
|
||||
return replace_ongoing_key(PG_C, ongoing_keycode, record);
|
||||
|
||||
case PG_C:
|
||||
// cs SFB
|
||||
return replace_ongoing_key(PG_S, next_keycode, record);
|
||||
return replace_ongoing_key(PG_S, ongoing_keycode, record);
|
||||
|
||||
case PG_N:
|
||||
// n. SFB
|
||||
return replace_ongoing_key(PG_POIN, next_keycode, record);
|
||||
return replace_ongoing_key(PG_POIN, ongoing_keycode, record);
|
||||
|
||||
case PG_P:
|
||||
// ph SFB
|
||||
return replace_ongoing_key(PG_H, next_keycode, record);
|
||||
return replace_ongoing_key(PG_H, ongoing_keycode, record);
|
||||
|
||||
case PG_G:
|
||||
// gt SFB
|
||||
return replace_ongoing_key(PG_T, next_keycode, record);
|
||||
return replace_ongoing_key(PG_T, ongoing_keycode, record);
|
||||
|
||||
case PG_Q:
|
||||
// qué scissor
|
||||
//return finish_word((uint16_t[]) {PG_U, PG_EACU}, 2, next_keycode, record);
|
||||
//return finish_word((uint16_t[]) {PG_U, PG_EACU}, 2, ongoing_keycode, record);
|
||||
process_key(PG_U,record);
|
||||
return replace_ongoing_key(PG_EACU, next_keycode, record);
|
||||
return replace_ongoing_key(PG_EACU, ongoing_keycode, record);
|
||||
|
||||
case PG_Y:
|
||||
// you bad redirection
|
||||
//return finish_word((uint16_t[]) {PG_O, PG_U}, 2, next_keycode, record);
|
||||
//return finish_word((uint16_t[]) {PG_O, PG_U}, 2, ongoing_keycode, record);
|
||||
process_key(PG_O,record);
|
||||
return replace_ongoing_key(PG_U, next_keycode, record);
|
||||
return replace_ongoing_key(PG_U, ongoing_keycode, record);
|
||||
|
||||
case PG_T:
|
||||
// "the"
|
||||
//return finish_word((uint16_t[]) {PG_H, PG_E}, 2, next_keycode, record);
|
||||
//return finish_word((uint16_t[]) {PG_H, PG_E}, 2, ongoing_keycode, record);
|
||||
process_key(PG_H,record);
|
||||
return replace_ongoing_key(PG_E, next_keycode, record);
|
||||
return replace_ongoing_key(PG_E, ongoing_keycode, record);
|
||||
|
||||
case PG_I:
|
||||
//return finish_word((uint16_t[]) {PG_O, PG_N}, 2, next_keycode, record);
|
||||
//return finish_word((uint16_t[]) {PG_O, PG_N}, 2, ongoing_keycode, record);
|
||||
process_key(PG_O,record);
|
||||
return replace_ongoing_key(PG_N, next_keycode, record);
|
||||
return replace_ongoing_key(PG_N, ongoing_keycode, record);
|
||||
|
||||
case PG_M:
|
||||
if (is_letter(recent[RECENT_SIZE - 2])) {
|
||||
if (is_letter(get_recent_keycode(-2))) {
|
||||
// "ment"
|
||||
return finish_word((uint16_t[]) {PG_E, PG_N, PG_T}, 3, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_E, PG_N, PG_T}, 3, ongoing_keycode, record);
|
||||
} else {
|
||||
// "même"
|
||||
return finish_word((uint16_t[]) {PG_ODK, PG_O, PG_M, PG_E}, 4, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_ODK, PG_O, PG_M, PG_E}, 4, ongoing_keycode, record);
|
||||
}
|
||||
|
||||
case PG_B:
|
||||
// "beaucoup"
|
||||
return finish_word((uint16_t[]) {PG_E, PG_A, PG_U, PG_C, PG_O, PG_U, PG_P}, 7, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_E, PG_A, PG_U, PG_C, PG_O, PG_U, PG_P}, 7, ongoing_keycode, record);
|
||||
|
||||
case PG_D:
|
||||
// "déjà"
|
||||
return finish_word((uint16_t[]) {PG_EACU, PG_J, PG_ODK, PG_A}, 4, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_EACU, PG_J, PG_ODK, PG_A}, 4, ongoing_keycode, record);
|
||||
|
||||
default:
|
||||
// "à"
|
||||
process_key(PG_ODK, record);
|
||||
return replace_ongoing_key(PG_A, next_keycode, record);
|
||||
return replace_ongoing_key(PG_A, ongoing_keycode, record);
|
||||
}
|
||||
|
||||
case PG_AROB:
|
||||
if (!is_letter(recent[RECENT_SIZE - 2])) {
|
||||
if (!is_letter(get_recent_keycode(-2))) {
|
||||
switch (prev_keycode) {
|
||||
|
||||
case PG_P:
|
||||
// "p@" -> "problème"
|
||||
layer_off(_ODK);
|
||||
return finish_word((uint16_t[]) {PG_R, PG_O, PG_B, PG_L, PG_ODK, PG_E, PG_M, PG_E}, 8, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_R, PG_O, PG_B, PG_L, PG_ODK, PG_E, PG_M, PG_E}, 8, ongoing_keycode, record);
|
||||
|
||||
case PG_A:
|
||||
// "a@" -> "aujourd'hui"
|
||||
layer_off(_ODK);
|
||||
return finish_word((uint16_t[]) {PG_U, PG_J, PG_O, PG_U, PG_R, PG_D, PG_APOS, PG_H, PG_U, PG_I}, 10, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_U, PG_J, PG_O, PG_U, PG_R, PG_D, PG_APOS, PG_H, PG_U, PG_I}, 10, ongoing_keycode, record);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -202,29 +201,44 @@ void get_clever_keycode(uint16_t* next_keycode, keyrecord_t* record) {
|
|||
case PG_M:
|
||||
if (prev_keycode == PG_C) {
|
||||
// "cm" -> "ch"
|
||||
bkspc_countdown = 0;
|
||||
return replace_ongoing_key(PG_H, next_keycode, record);
|
||||
update_bkspc_countdown(0);
|
||||
return replace_ongoing_key(PG_H, ongoing_keycode, record);
|
||||
}
|
||||
break;
|
||||
|
||||
case PG_H:
|
||||
if (prev_keycode == PG_M) {
|
||||
// "mh" -> "mb"
|
||||
bkspc_countdown = 0;
|
||||
return replace_ongoing_key(PG_B, next_keycode, record);
|
||||
update_bkspc_countdown(0);
|
||||
return replace_ongoing_key(PG_B, ongoing_keycode, record);
|
||||
} else if (prev_keycode == PG_I) {
|
||||
// "ih" -> "ique"
|
||||
return finish_word((uint16_t[]) {PG_Q, PG_U, PG_E}, 3, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_Q, PG_U, PG_E}, 3, ongoing_keycode, record);
|
||||
}
|
||||
break;
|
||||
|
||||
case OU_GRV:
|
||||
layer_off(_ODK);
|
||||
return finish_word((uint16_t[]) {PG_O, PG_ODK, PG_N}, 3, next_keycode, record);
|
||||
return finish_word((uint16_t[]) {PG_O, PG_ODK, PG_N}, 3, ongoing_keycode, record);
|
||||
|
||||
case PG_APOS:
|
||||
if (is_apos_dr) { return replace_ongoing_key(PG_APOD, next_keycode, record); }
|
||||
if (replace_apos()) { return replace_ongoing_key(PG_APOD, ongoing_keycode, record); }
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Boucle de CapsWord :
|
||||
|
||||
on press:
|
||||
clear_weak_mods();
|
||||
|
||||
if (caps_word_press_user(keycode)) {
|
||||
send_keyboard_report();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
caps_word_off();
|
||||
return true;
|
||||
*/
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
void get_clever_keycode(uint16_t* next_keycode, keyrecord_t* record);
|
||||
void get_clever_keycode(uint16_t* ongoing_keycode, keyrecord_t* record);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
#include "capslist.h"
|
||||
|
||||
static bool caps_list_active = false;
|
||||
//static unsigned short int capslist_countdown = 0;
|
||||
unsigned short int capslist_countdown = 0;
|
||||
//static unsigned short int countdown_end = 5;
|
||||
unsigned short int countdown_end = 5;
|
||||
static signed char capslist_countdown = 1;
|
||||
static unsigned char countdown_end = 6;
|
||||
|
||||
bool is_caps_list_on(void) { return caps_list_active; }
|
||||
|
||||
|
|
@ -12,8 +10,8 @@ void enable_caps_list(void) {
|
|||
if (is_caps_lock_on()) { tap_code(KC_CAPS); }
|
||||
caps_word_on();
|
||||
caps_list_active = true;
|
||||
capslist_countdown = 0;
|
||||
countdown_end = 5;
|
||||
capslist_countdown = 1;
|
||||
countdown_end = 6;
|
||||
}
|
||||
|
||||
void disable_caps_list(void) {
|
||||
|
|
@ -29,6 +27,19 @@ void toggle_caps_list(void) {
|
|||
}
|
||||
}
|
||||
|
||||
bool update_capslist_countdown(signed char i) {
|
||||
capslist_countdown = capslist_countdown + i;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool word_check(uint16_t keycodes[], uint8_t num_keycodes, unsigned char new_countdown_end) {
|
||||
for (int i = 0; i < num_keycodes; ++i) {
|
||||
if (get_recent_keycode(- 2 - i) != keycodes[num_keycodes - 1 - i]) { return false; }
|
||||
}
|
||||
countdown_end = new_countdown_end;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool process_caps_list(uint16_t keycode, keyrecord_t *record) {
|
||||
// Handle the custom keycodes that go with this feature
|
||||
if (keycode == CAPSLIST) {
|
||||
|
|
@ -59,9 +70,11 @@ bool process_caps_list(uint16_t keycode, keyrecord_t *record) {
|
|||
}
|
||||
|
||||
if (should_continue_caps_list(keycode)) {
|
||||
|
||||
if (caps_word_reactivation()) {
|
||||
caps_word_on(); // Reactivate Caps Word for a new word
|
||||
capslist_countdown = 0;
|
||||
capslist_countdown = 1;
|
||||
return true;
|
||||
}
|
||||
if (capslist_countdown < countdown_end) { return true; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,8 +3,6 @@
|
|||
#include "quantum.h"
|
||||
#include "keymap.h"
|
||||
|
||||
extern unsigned short int capslist_countdown;
|
||||
extern unsigned short int countdown_end;
|
||||
|
||||
bool is_caps_list_on(void);
|
||||
|
||||
|
|
@ -12,6 +10,9 @@ void enable_caps_list(void);
|
|||
void disable_caps_list(void);
|
||||
void toggle_caps_list(void);
|
||||
|
||||
bool update_capslist_countdown(signed char i);
|
||||
bool word_check(uint16_t keycodes[], uint8_t num_keycodes, unsigned char new_countdown_end);
|
||||
|
||||
bool process_caps_list(uint16_t keycode, keyrecord_t *record);
|
||||
|
||||
bool should_continue_caps_list(uint16_t keycode);
|
||||
|
|
|
|||
|
|
@ -16,14 +16,22 @@
|
|||
|
||||
#include "clever_keys_utilities.h"
|
||||
|
||||
uint16_t recent[RECENT_SIZE] = {KC_NO};
|
||||
static uint16_t recent[RECENT_SIZE] = {KC_NO};
|
||||
uint16_t deadline = 0;
|
||||
unsigned short int bkspc_countdown = RECENT_SIZE + 1;
|
||||
static unsigned char bkspc_countdown = RECENT_SIZE + 1;
|
||||
|
||||
// Copy of the record argument for the clever key.
|
||||
static keyrecord_t mod_record;
|
||||
static bool processingCK = false;
|
||||
|
||||
uint16_t get_recent_keycode(signed char i) {
|
||||
return recent[RECENT_SIZE + i];
|
||||
}
|
||||
|
||||
void update_bkspc_countdown(unsigned char i) {
|
||||
bkspc_countdown = i;
|
||||
}
|
||||
|
||||
void clear_recent_keys(void) {
|
||||
memset(recent, 0, sizeof(recent)); // Set all zeros (KC_NO).
|
||||
bkspc_countdown = RECENT_SIZE + 1;
|
||||
|
|
|
|||
|
|
@ -26,9 +26,10 @@ extern "C" {
|
|||
|
||||
#define RECENT_SIZE 8 // Number of keys in `recent` buffer.
|
||||
|
||||
extern uint16_t recent[RECENT_SIZE];
|
||||
uint16_t deadline;
|
||||
extern unsigned short int bkspc_countdown;
|
||||
|
||||
uint16_t get_recent_keycode(signed char);
|
||||
void update_bkspc_countdown(unsigned char i);
|
||||
|
||||
void clear_recent_keys(void);
|
||||
void recent_keys_task(void);
|
||||
|
|
|
|||
|
|
@ -70,20 +70,11 @@ combo_t key_combos[] = {
|
|||
[ALTESC] = COMBO(altesc_combo, LALT(KC_ESC))
|
||||
};
|
||||
|
||||
/* uint16_t get_combo_term(uint16_t combo_index, combo_t *combo) {
|
||||
switch (combo_index) {
|
||||
case L_APOST:
|
||||
case D_APOST:
|
||||
return 100;
|
||||
default:
|
||||
return COMBO_TERM;
|
||||
}
|
||||
} */
|
||||
|
||||
bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
|
||||
// Chorded mods shouldn't be considered as combos.
|
||||
if (os4a_layer != 0) {
|
||||
return (os4a_layer == _R_MODS) == on_left_hand(record->event.key);
|
||||
if (get_os4a_layer() != 0) {
|
||||
return (get_os4a_layer() == _R_MODS) == on_left_hand(record->event.key);
|
||||
}
|
||||
// Some combos shouldn't be affected by global_quick_tap_timer.
|
||||
switch (combo_index) {
|
||||
|
|
@ -95,10 +86,8 @@ bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode
|
|||
return true;
|
||||
|
||||
default:
|
||||
//return timer_elapsed(global_quick_tap_timer) > TAP_INTERVAL;
|
||||
if (timer_elapsed(global_quick_tap_timer) < TAP_INTERVAL) {
|
||||
return false;
|
||||
}
|
||||
//return enough_time_before_combo(); // takes more space
|
||||
if (!enough_time_before_combo()) { return false; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -107,29 +96,28 @@ bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode
|
|||
void process_combo_event(uint16_t combo_index, bool pressed) {
|
||||
switch (combo_index) {
|
||||
case ALTTAB:
|
||||
if (pressed) {
|
||||
register_mods(MOD_LALT);
|
||||
tap_code(KC_TAB);
|
||||
} else {
|
||||
unregister_mods(MOD_LALT);
|
||||
}
|
||||
break;
|
||||
if (pressed) {
|
||||
register_mods(MOD_LALT);
|
||||
tap_code(KC_TAB);
|
||||
} else {
|
||||
unregister_mods(MOD_LALT);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool process_combo_key_repress(uint16_t combo_index, combo_t *combo, uint8_t key_index, uint16_t keycode) {
|
||||
switch (combo_index) {
|
||||
case ALTTAB:
|
||||
switch (keycode) {
|
||||
case PG_Y:
|
||||
tap_code16(S(KC_TAB));
|
||||
return true;
|
||||
case PG_H:
|
||||
tap_code(KC_TAB);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
switch (keycode) {
|
||||
case PG_Y:
|
||||
tap_code16(S(KC_TAB));
|
||||
return true;
|
||||
case PG_H:
|
||||
tap_code(KC_TAB);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -16,7 +16,11 @@
|
|||
|
||||
#include "macros.h"
|
||||
|
||||
bool is_apos_dr = false;
|
||||
static bool is_apos_dr = false;
|
||||
|
||||
bool replace_apos(void) {
|
||||
return is_apos_dr;
|
||||
}
|
||||
|
||||
bool process_macros(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
|
|
|
|||
|
|
@ -23,8 +23,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern bool is_apos_dr;
|
||||
|
||||
bool replace_apos(void);
|
||||
bool process_macros(uint16_t keycode, keyrecord_t *record);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
//static uint16_t num_word_timer = 0;
|
||||
//static bool is_num_word_on = false;
|
||||
bool is_num_word_on = false;
|
||||
static bool is_num_word_on = false;
|
||||
static bool exit_num_word = false;
|
||||
|
||||
bool is_num_word_enabled(void) {
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
#include "keymap.h"
|
||||
|
||||
bool is_num_word_enabled(void);
|
||||
extern bool is_num_word_on;
|
||||
|
||||
void enable_num_word(void);
|
||||
void disable_num_word(void);
|
||||
|
|
|
|||
|
|
@ -23,9 +23,13 @@ oneshot_state os_alt_state = os_up_unqueued;
|
|||
oneshot_state os_altgr_state = os_up_unqueued;
|
||||
oneshot_state os_win_state = os_up_unqueued;
|
||||
|
||||
uint8_t os4a_layer = 0;
|
||||
static uint8_t os4a_layer = 0;
|
||||
static bool exit_os4a_layer = false;
|
||||
|
||||
uint8_t get_os4a_layer(void) {
|
||||
return (os4a_layer);
|
||||
}
|
||||
|
||||
void os4a_layer_on(uint8_t layer) {
|
||||
layer_on(layer);
|
||||
os4a_layer = layer;
|
||||
|
|
@ -40,7 +44,7 @@ void os4a_layer_off(uint8_t layer) {
|
|||
void os4a_tap(uint16_t keycode) {
|
||||
if (os4a_layer == 0) {
|
||||
// Activate OS4A layer
|
||||
os4a_layer_on(get_os4a_layer(keycode));
|
||||
os4a_layer_on(os4a_layer_from_trigger(keycode));
|
||||
} else {
|
||||
// Press again an OS4A key to exit the OS4A layer and clear the OS mods.
|
||||
os4a_layer_off(os4a_layer);
|
||||
|
|
@ -57,25 +61,27 @@ bool process_os4a_keys(uint16_t keycode, keyrecord_t *record) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool os4a_layer_process_outcome(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
// Should keycode exit the OS4A layer without further process ?
|
||||
if (should_exit_os4a_layer(keycode)) { return true; }
|
||||
bool add_shift(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
// Should keycode stay on the OS4A layer, to be possibly combined with another one, e.g. Callum mod ?
|
||||
if (is_oneshot_ignored_key(keycode)) { return false; }
|
||||
// Testing exit_os4a_layer is necessary to prevent OS shift to be added in case of rolled keys
|
||||
// or when other features invoke keycodes to be processed (ex: custom altgr, clever keys).
|
||||
if (exit_os4a_layer) { return false; }
|
||||
|
||||
// Add OS Shift when no other mods are active.
|
||||
// Testing exit_os4a_layer is necessary to prevent OS shift to be added when other features create keyrecords
|
||||
// to be processed (ex: custom altgr, clever keys).
|
||||
const uint8_t mods = get_mods() | get_oneshot_mods();
|
||||
if (!exit_os4a_layer && to_be_shifted(keycode, record) && mods == 0) {
|
||||
set_oneshot_mods(MOD_BIT(KC_LSFT));
|
||||
// Don't use weak mods, it interferes with Capsword.
|
||||
}
|
||||
return true;
|
||||
// Shift shouldn't be added if other mods are active
|
||||
if ((get_mods() | get_oneshot_mods()) != 0) { return false; }
|
||||
|
||||
// Combos and encoder events.
|
||||
if (!IS_KEYEVENT(record->event)) { return true; }
|
||||
|
||||
// Specific exceptions
|
||||
if (not_to_be_shifted(keycode)) { return false; }
|
||||
|
||||
// Otherwise, add shift if the key is on the other side of the keyboard.
|
||||
return (os4a_layer == _R_MODS) == on_left_hand(record->event.key);
|
||||
}
|
||||
|
||||
|
||||
void mouse_mods_key_up(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
// The OS4A layer must be exited only when ctrl or shift are registered,
|
||||
|
|
@ -104,7 +110,14 @@ bool process_mods(uint16_t keycode, keyrecord_t *record) {
|
|||
if (os4a_layer != 0) {
|
||||
|
||||
if (record->event.pressed) {
|
||||
exit_os4a_layer = os4a_layer_process_outcome(keycode, record);
|
||||
|
||||
if (should_stay_os4a_layer(keycode)) {
|
||||
exit_os4a_layer = false;
|
||||
} else {
|
||||
if (add_shift(keycode, record)) { set_oneshot_mods(MOD_BIT(KC_LSFT)); }
|
||||
exit_os4a_layer = true;
|
||||
}
|
||||
|
||||
} else {
|
||||
// When Ctrl or Shift are released, for mouse use.
|
||||
//if (mods_for_mouse(keycode)) { mouse_mods_key_up(keycode, record); }
|
||||
|
|
|
|||
|
|
@ -24,18 +24,15 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern uint8_t os4a_layer;
|
||||
uint8_t get_os4a_layer(void);
|
||||
|
||||
void os4a_layer_off(uint8_t layer);
|
||||
void os4a_layer_on(uint8_t layer);
|
||||
|
||||
void os4a_tap(uint16_t keycode);
|
||||
|
||||
bool process_os4a_keys(uint16_t keycode, keyrecord_t *record);
|
||||
|
||||
void update_osl(uint16_t keycode);
|
||||
|
||||
bool os4a_layer_process_outcome(uint16_t keycode, keyrecord_t *record);
|
||||
bool add_shift(uint16_t keycode, keyrecord_t *record);
|
||||
|
||||
void mouse_mods_key_up(uint16_t keycode, keyrecord_t *record);
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ uint16_t tap_hold_extractor(uint16_t keycode) {
|
|||
case LT_NBSPC:
|
||||
return NNB_SPC;
|
||||
default:
|
||||
return keycode &= 0xff;
|
||||
return keycode &= 0xff; //QK_MOD_TAP_GET_TAP_KEYCODE(keycode)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -86,7 +86,7 @@ uint16_t get_ongoing_keycode_user(uint16_t keycode) {
|
|||
|
||||
// One-shot 4 all configuration
|
||||
|
||||
uint8_t get_os4a_layer(uint16_t keycode) {
|
||||
uint8_t os4a_layer_from_trigger(uint16_t keycode) {
|
||||
switch (keycode) {
|
||||
case L_OS4A: return _L_MODS;
|
||||
case R_OS4A: return _R_MODS;
|
||||
|
|
@ -94,30 +94,31 @@ uint8_t get_os4a_layer(uint16_t keycode) {
|
|||
}
|
||||
}
|
||||
|
||||
bool should_exit_os4a_layer(uint16_t keycode) {
|
||||
bool should_stay_os4a_layer(uint16_t keycode) {
|
||||
// keycodes that stay on os4a layers w/o being shifted
|
||||
switch (keycode) {
|
||||
case OS_FA:
|
||||
case NUMWORD:
|
||||
case TG_FA:
|
||||
case OS_RSA:
|
||||
case NUM_ODK:
|
||||
case OS_SHFT:
|
||||
case OS_CTRL:
|
||||
case OS_RALT:
|
||||
case OS_LALT:
|
||||
case OS_WIN:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool to_be_shifted(uint16_t keycode, keyrecord_t *record) {
|
||||
// Combos and encoder events.
|
||||
if (!IS_KEYEVENT(record->event)) { return true; }
|
||||
|
||||
bool not_to_be_shifted(uint16_t keycode) {
|
||||
// keycodes that exit os4a layers w/o being shifted
|
||||
switch (keycode) {
|
||||
case KC_CAPS:
|
||||
case CAPSWORD:
|
||||
case CAPSLIST:
|
||||
return false;
|
||||
default:
|
||||
return (os4a_layer == _R_MODS) == on_left_hand(record->event.key);
|
||||
case KC_CAPS:
|
||||
case CAPSWORD:
|
||||
case CAPSLIST:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -155,10 +156,10 @@ bool is_oneshot_ignored_key(uint16_t keycode) {
|
|||
case OS_RALT:
|
||||
case OS_LALT:
|
||||
case OS_WIN:
|
||||
// OS_FA must be on the list, to be combined with Alt
|
||||
case OS_FA:
|
||||
case NUMWORD:
|
||||
case OS_FA: // to be combined with Alt
|
||||
case TG_FA:
|
||||
case NUMWORD: // to combine numbers with mods
|
||||
//case NUM_ODK: // NUM_ODK sends PG_ODK when pressed. When shifted, PG_ODK sends one-shot shift.
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
@ -186,7 +187,7 @@ uint16_t get_alt_repeat_key_keycode_user(uint16_t keycode, uint8_t mods) {
|
|||
return C(PG_Z);
|
||||
}
|
||||
|
||||
if (recent[RECENT_SIZE - 1] != KC_NO) { return MAGIC; }
|
||||
if (get_recent_keycode(-1) != KC_NO) { return MAGIC; }
|
||||
if (get_last_keycode() == KC_NO) { return MAGIC; }
|
||||
|
||||
return KC_TRNS; // Defer to default definitions.
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ bool process_custom_tap_hold(uint16_t keycode, keyrecord_t *record);
|
|||
|
||||
uint16_t get_ongoing_keycode_user(uint16_t keycode);
|
||||
|
||||
uint8_t get_os4a_layer(uint16_t keycode);
|
||||
bool should_exit_os4a_layer(uint16_t keycode);
|
||||
bool to_be_shifted(uint16_t keycode, keyrecord_t *record);
|
||||
uint8_t os4a_layer_from_trigger(uint16_t keycode);
|
||||
bool should_stay_os4a_layer(uint16_t keycode);
|
||||
bool not_to_be_shifted(uint16_t keycode);
|
||||
//bool mods_for_mouse(uint16_t keycode);
|
||||
|
|
@ -20,7 +20,14 @@
|
|||
#include "keymap.h"
|
||||
|
||||
|
||||
uint16_t global_quick_tap_timer = 0;
|
||||
static uint16_t global_quick_tap_timer = 0;
|
||||
|
||||
bool enough_time_before_combo(void) {
|
||||
return timer_elapsed(global_quick_tap_timer) > TAP_INTERVAL;
|
||||
}
|
||||
|
||||
static uint16_t next_keycode;
|
||||
static keyrecord_t next_record;
|
||||
|
||||
|
||||
// Tap-hold configuration
|
||||
|
|
@ -65,9 +72,6 @@ void matrix_scan_user(void) {
|
|||
|
||||
// Key processing
|
||||
|
||||
uint16_t next_keycode;
|
||||
keyrecord_t next_record;
|
||||
|
||||
bool pre_process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
if (record->event.pressed) {
|
||||
|
|
@ -113,8 +117,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
|
||||
void post_process_record_user(uint16_t keycode, keyrecord_t* record) {
|
||||
|
||||
//os4a_layer_exit_check();
|
||||
//numword_exit_check();
|
||||
end_CK(record);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,30 +65,28 @@ enum custom_keycodes {
|
|||
PG_DEG
|
||||
};
|
||||
|
||||
// Layer taps
|
||||
// Layer changers
|
||||
#define LT_SPC LT(_SYMBOLS, KC_SPC)
|
||||
#define LT_E LT(_SYMBOLS, PG_E)
|
||||
#define LT_REPT LT(_NUMBERS, KC_1)
|
||||
#define LT_MGC LT(_SHORTNAV, KC_1)
|
||||
#define OS_FA OSL(_FUNCAPPS)
|
||||
#define TG_FA TT(_FUNCAPPS)
|
||||
#define MT_SLSH SFT_T(PG_SLSH)
|
||||
#define MT_1 SFT_T(KC_1)
|
||||
#define LT_0 LT(_SYMBOLS, KC_0)
|
||||
#define LT_NBSPC LT(_SHORTNAV, NNB_SPC)
|
||||
#define E_CIRC S(FG_0)
|
||||
#define OS_ODK OSL(_ODK)
|
||||
#define OS_RSA OSM(MOD_RALT | MOD_LSFT)
|
||||
#define NUM_ODK OSL(_NUMBERS)
|
||||
|
||||
// One shot mods
|
||||
#define OS_ODK OSL(_ODK)
|
||||
#define NUM_ODK OSL(_NUMBERS)
|
||||
#define OS_FA OSL(_FUNCAPPS)
|
||||
#define TG_FA TT(_FUNCAPPS)
|
||||
|
||||
// Mods
|
||||
#define MT_SLSH SFT_T(PG_SLSH)
|
||||
#define MT_1 SFT_T(KC_1)
|
||||
#define OS_RSA OSM(MOD_RALT | MOD_LSFT)
|
||||
|
||||
// OS4A
|
||||
#define L_OS4A LSFT_T(OS4A)
|
||||
#define R_OS4A RSFT_T(OS4A)
|
||||
#define IS_OS4A_KEY(keycode) (get_os4a_layer(keycode) != 0)
|
||||
#define IS_OS4A_KEY(keycode) (os4a_layer_from_trigger(keycode) != 0)
|
||||
|
||||
bool forbidden_chord(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record, uint16_t other_keycode, keyrecord_t* other_record);
|
||||
|
||||
extern uint16_t global_quick_tap_timer;
|
||||
|
||||
extern uint16_t next_keycode;
|
||||
extern keyrecord_t next_record;
|
||||
bool enough_time_before_combo(void);
|
||||
bool forbidden_chord(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record, uint16_t other_keycode, keyrecord_t* other_record);
|
||||
|
|
@ -79,7 +79,7 @@ bool oled_task_user(void) {
|
|||
oled_write_P(((mods & MOD_BIT(KC_LALT)) == MOD_BIT(KC_LALT)) ? PSTR("ALT ") : PSTR(" "), false);
|
||||
|
||||
oled_write_P(is_caps_word_on() ? PSTR("CAPSWORD\n") : PSTR(" \n"), false);
|
||||
oled_write_P(is_num_word_on ? PSTR("NUMWORD\n") : PSTR(" \n"), false);
|
||||
oled_write_P(is_num_word_enabled() ? PSTR("NUMWORD\n") : PSTR(" \n"), false);
|
||||
|
||||
// Write host Keyboard LED Status to OLEDs
|
||||
led_t led_usb_state = host_keyboard_led_state();
|
||||
|
|
|
|||
|
|
@ -146,28 +146,20 @@ bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record) {
|
|||
// Caps List
|
||||
|
||||
bool should_continue_caps_list(uint16_t keycode) {
|
||||
if (keycode == KC_BSPC) {
|
||||
capslist_countdown--;
|
||||
return true;
|
||||
}
|
||||
if (is_letter(keycode) || is_send_string_macro(keycode)) {
|
||||
capslist_countdown++;
|
||||
return true;
|
||||
}
|
||||
if (caps_word_press_user(keycode)) {
|
||||
// This condition can't be merged with the previous one
|
||||
// because caps_word_press_user adds shift to letters and send-string macros.
|
||||
capslist_countdown++;
|
||||
return true;
|
||||
}
|
||||
if (keycode == KC_BSPC) { return update_capslist_countdown(-1); }
|
||||
|
||||
if (is_letter(keycode) || is_send_string_macro(keycode)) { return update_capslist_countdown(1); }
|
||||
|
||||
// This condition can't be merged with the previous one
|
||||
// because caps_word_press_user adds shift to letters and send-string macros.
|
||||
if (caps_word_press_user(keycode)) { return update_capslist_countdown(1); }
|
||||
|
||||
// Keycodes that continue Caps List, but not Caps Word.
|
||||
// These keycodes trigger the countdown to end Caps List.
|
||||
switch (keycode) {
|
||||
case PG_VIRG:
|
||||
case KC_SPC:
|
||||
capslist_countdown++;
|
||||
return true;
|
||||
return update_capslist_countdown(1);
|
||||
}
|
||||
return false; // Deactivate Caps List.
|
||||
}
|
||||
|
|
@ -176,18 +168,23 @@ bool should_continue_caps_list(uint16_t keycode) {
|
|||
bool caps_word_reactivation(void) {
|
||||
|
||||
// Words that continue Caps List.
|
||||
if (recent[RECENT_SIZE - 1] == KC_SPC) {
|
||||
if (recent[RECENT_SIZE - 4] == KC_SPC && recent[RECENT_SIZE - 3] == PG_E && recent[RECENT_SIZE - 2] == PG_T) {
|
||||
countdown_end = 1;
|
||||
if (get_recent_keycode(-1) == KC_SPC) {
|
||||
|
||||
if (get_recent_keycode(-2) == PG_VIRG) { return true; }
|
||||
|
||||
if (word_check((uint16_t[]) {KC_SPC, PG_E, PG_T}, 3, 2)) { return true; }
|
||||
|
||||
if (word_check((uint16_t[]) {KC_SPC, PG_O, PG_U}, 3, 2)) { return true; }
|
||||
|
||||
/* if (get_recent_keycode(-4) == KC_SPC && get_recent_keycode(-3) == PG_E && get_recent_keycode(-2) == PG_T) {
|
||||
countdown_end = 2;
|
||||
return true;
|
||||
}
|
||||
if (recent[RECENT_SIZE - 4] == KC_SPC && recent[RECENT_SIZE - 3] == PG_O && recent[RECENT_SIZE - 2] == PG_U) {
|
||||
countdown_end = 1;
|
||||
if (get_recent_keycode(-4) == KC_SPC && get_recent_keycode(-3) == PG_O && get_recent_keycode(-2) == PG_U) {
|
||||
countdown_end = 2;
|
||||
return true;
|
||||
}
|
||||
if (recent[RECENT_SIZE - 2] == PG_VIRG) {
|
||||
return true;
|
||||
}
|
||||
} */
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue