mirror of
				https://github.com/qmk/qmk_userspace.git
				synced 2025-11-03 18:30:07 -05:00 
			
		
		
		
	num layer and NumWord refactor
This commit is contained in:
		
					parent
					
						
							
								d31eef7e68
							
						
					
				
			
			
				commit
				
					
						0568104b4b
					
				
			
		
					 8 changed files with 181 additions and 392 deletions
				
			
		| 
						 | 
					@ -1,7 +1,6 @@
 | 
				
			||||||
#include "capslist.h"
 | 
					#include "capslist.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool caps_list_active = false;
 | 
					static bool caps_list_active = false;
 | 
				
			||||||
//static bool last_word = false;
 | 
					 | 
				
			||||||
static unsigned short int capslist_countdown = 0;
 | 
					static unsigned short int capslist_countdown = 0;
 | 
				
			||||||
static unsigned short int countdown_end = 5;
 | 
					static unsigned short int countdown_end = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +10,6 @@ void enable_caps_list(void) {
 | 
				
			||||||
    if (is_caps_lock_on()) { tap_code(KC_CAPS); }
 | 
					    if (is_caps_lock_on()) { tap_code(KC_CAPS); }
 | 
				
			||||||
    caps_word_on();
 | 
					    caps_word_on();
 | 
				
			||||||
    caps_list_active = true;
 | 
					    caps_list_active = true;
 | 
				
			||||||
    //last_word = false;
 | 
					 | 
				
			||||||
    capslist_countdown = 0;
 | 
					    capslist_countdown = 0;
 | 
				
			||||||
    countdown_end = 5;
 | 
					    countdown_end = 5;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -34,7 +32,6 @@ bool process_caps_list(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
    if (keycode == CAPSLIST) {
 | 
					    if (keycode == CAPSLIST) {
 | 
				
			||||||
        if (record->event.pressed) {
 | 
					        if (record->event.pressed) {
 | 
				
			||||||
          toggle_caps_list();
 | 
					          toggle_caps_list();
 | 
				
			||||||
          //enable_caps_list();
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -55,12 +52,11 @@ bool process_caps_list(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
        case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
 | 
					        case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
 | 
				
			||||||
          // Earlier return if this has not been considered tapped yet
 | 
					          // Earlier return if this has not been considered tapped yet
 | 
				
			||||||
          if (record->tap.count == 0) { return true; }
 | 
					          if (record->tap.count == 0) { return true; }
 | 
				
			||||||
          keycode = keycode & 0xFF;    // Get tapping keycode.
 | 
					          keycode = tap_hold_extractor(keycode);    // Get tapping keycode.
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (should_continue_caps_list(keycode)) {
 | 
					    if (should_continue_caps_list(keycode)) {
 | 
				
			||||||
        //if (is_caps_lock_on()) { return true; }
 | 
					 | 
				
			||||||
        if (caps_word_reactivation()) {
 | 
					        if (caps_word_reactivation()) {
 | 
				
			||||||
            caps_word_on();  // Reactivate Caps Word for a new word
 | 
					            caps_word_on();  // Reactivate Caps Word for a new word
 | 
				
			||||||
            capslist_countdown = 0;
 | 
					            capslist_countdown = 0;
 | 
				
			||||||
| 
						 | 
					@ -71,7 +67,7 @@ bool process_caps_list(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//bool caps_list_press_user(uint16_t keycode) {
 | 
					
 | 
				
			||||||
bool should_continue_caps_list(uint16_t keycode) {
 | 
					bool should_continue_caps_list(uint16_t keycode) {
 | 
				
			||||||
    if (keycode == KC_BSPC) {
 | 
					    if (keycode == KC_BSPC) {
 | 
				
			||||||
        capslist_countdown--;
 | 
					        capslist_countdown--;
 | 
				
			||||||
| 
						 | 
					@ -97,6 +93,7 @@ bool should_continue_caps_list(uint16_t keycode) {
 | 
				
			||||||
    return false;  // Deactivate Caps List.
 | 
					    return false;  // Deactivate Caps List.
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool caps_word_reactivation(void) {
 | 
					bool caps_word_reactivation(void) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Words that continue Caps List.
 | 
					    // Words that continue Caps List.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,122 @@
 | 
				
			||||||
 | 
					/* Copyright 2025 @Kawamashi
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					 * the Free Software Foundation, either version 2 of the License, or
 | 
				
			||||||
 | 
					 * (at your option) any later version.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					 * GNU General Public License for more details.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "numword.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//static uint16_t num_word_timer = 0;
 | 
				
			||||||
 | 
					//static bool is_num_word_on = false;
 | 
				
			||||||
 | 
					bool is_num_word_on = false;
 | 
				
			||||||
 | 
					static bool exit_num_word = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool is_num_word_enabled(void) {
 | 
				
			||||||
 | 
					    return is_num_word_on;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void enable_num_word(void) {
 | 
				
			||||||
 | 
					    //if (is_num_word_on) return;
 | 
				
			||||||
 | 
					    is_num_word_on = true;
 | 
				
			||||||
 | 
					    layer_on(_NUMBERS);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void disable_num_word(void) {
 | 
				
			||||||
 | 
					    //if (!is_num_word_on) return;
 | 
				
			||||||
 | 
					    is_num_word_on = false;
 | 
				
			||||||
 | 
					    layer_off(_NUMBERS);
 | 
				
			||||||
 | 
					    exit_num_word = false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void toggle_num_word(void) {
 | 
				
			||||||
 | 
					    if (is_num_word_on) {
 | 
				
			||||||
 | 
					        disable_num_word();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        enable_num_word();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (keycode) {
 | 
				
			||||||
 | 
					        // Keycodes which should not disable num word mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Numpad keycodes
 | 
				
			||||||
 | 
					         case KC_1 ... KC_0:
 | 
				
			||||||
 | 
					         case KC_PDOT:
 | 
				
			||||||
 | 
					         //case PG_X:
 | 
				
			||||||
 | 
					         //case PG_EACU:
 | 
				
			||||||
 | 
					         case PG_MOIN:
 | 
				
			||||||
 | 
					         case PG_ASTX: 
 | 
				
			||||||
 | 
					         case PG_PLUS:
 | 
				
			||||||
 | 
					         case PG_SLSH:
 | 
				
			||||||
 | 
					         case PG_EXP:
 | 
				
			||||||
 | 
					         case PG_IND:
 | 
				
			||||||
 | 
					         case PG_H:
 | 
				
			||||||
 | 
					         case PG_2PTS:
 | 
				
			||||||
 | 
					         case LT_EURO:
 | 
				
			||||||
 | 
					         case NNB_SPC:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Misc
 | 
				
			||||||
 | 
					        case KC_BSPC:
 | 
				
			||||||
 | 
					        case PG_ODK:   // Not to exit Numword when chording it with ODK
 | 
				
			||||||
 | 
					        case NUMWORD:   // For the combo NUMWORD to work
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*         
 | 
				
			||||||
 | 
					        case PG_EGAL:
 | 
				
			||||||
 | 
					        case PG_BSLS:*/
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool process_numword(uint16_t keycode, const keyrecord_t *record) {
 | 
				
			||||||
 | 
					    // Handle the custom keycodes that go with this feature
 | 
				
			||||||
 | 
					    if (keycode == NUMWORD) {
 | 
				
			||||||
 | 
					        if (record->event.pressed) { toggle_num_word(); }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Other than the custom keycodes, nothing else in this feature will activate
 | 
				
			||||||
 | 
					    // if the behavior is not on, so allow QMK to handle the event as usual.
 | 
				
			||||||
 | 
					    if (!is_num_word_on) { return true; }
 | 
				
			||||||
 | 
					    // Nothing else acts on key release, either
 | 
				
			||||||
 | 
					    if (!record->event.pressed) { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get the base keycode of a mod or layer tap key
 | 
				
			||||||
 | 
					    switch (keycode) {
 | 
				
			||||||
 | 
					        case QK_MOD_TAP ... QK_MOD_TAP_MAX:
 | 
				
			||||||
 | 
					        case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
 | 
				
			||||||
 | 
					            // Earlier return if this has not been considered tapped yet
 | 
				
			||||||
 | 
					            if (record->tap.count == 0) { return true; }
 | 
				
			||||||
 | 
					            keycode = keycode & 0xFF;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					/*         case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:  // `LT(layer, key)` keys.
 | 
				
			||||||
 | 
					            // Release event on a held layer-tap key when numword is on.
 | 
				
			||||||
 | 
					            if (record->tap.count == 0 && !record->event.pressed) {     
 | 
				
			||||||
 | 
					                return false;  // Skip default handling so that layer stays on.
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                keycode = keycode & 0xFF;    // Get tapping keycode.
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break; */
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exit_num_word = should_exit_num_word(keycode, record);
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void numword_exit_check(void) {
 | 
				
			||||||
 | 
					    if (exit_num_word) { disable_num_word(); }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,8 @@ bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record) {
 | 
				
			||||||
         case PG_IND:
 | 
					         case PG_IND:
 | 
				
			||||||
         case PG_H:
 | 
					         case PG_H:
 | 
				
			||||||
         case PG_2PTS:
 | 
					         case PG_2PTS:
 | 
				
			||||||
         case LT_EURO:
 | 
					         case PG_EURO:
 | 
				
			||||||
 | 
					         //case LT_NBSPC:
 | 
				
			||||||
         case NNB_SPC:
 | 
					         case NNB_SPC:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Misc
 | 
					        // Misc
 | 
				
			||||||
| 
						 | 
					@ -85,36 +86,38 @@ bool should_exit_num_word(uint16_t keycode, const keyrecord_t *record) {
 | 
				
			||||||
bool process_numword(uint16_t keycode, const keyrecord_t *record) {
 | 
					bool process_numword(uint16_t keycode, const keyrecord_t *record) {
 | 
				
			||||||
    // Handle the custom keycodes that go with this feature
 | 
					    // Handle the custom keycodes that go with this feature
 | 
				
			||||||
    if (keycode == NUMWORD) {
 | 
					    if (keycode == NUMWORD) {
 | 
				
			||||||
        if (record->event.pressed) {
 | 
					        if (record->event.pressed) { toggle_num_word(); }
 | 
				
			||||||
            toggle_num_word();
 | 
					        return false;
 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Other than the custom keycodes, nothing else in this feature will activate
 | 
					    // Other than the custom keycodes, nothing else in this feature will activate
 | 
				
			||||||
    // if the behavior is not on, so allow QMK to handle the event as usual.
 | 
					    // if the behavior is not on, so allow QMK to handle the event as usual.
 | 
				
			||||||
    if (!is_num_word_on) { return true; }
 | 
					    if (!is_num_word_on) { return true; }
 | 
				
			||||||
 | 
					    // Nothing else acts on key release, either
 | 
				
			||||||
 | 
					    if (record->event.pressed) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get the base keycode of a mod or layer tap key
 | 
					        // Get the base keycode of a mod or layer tap key
 | 
				
			||||||
    switch (keycode) {
 | 
					        switch (keycode) {
 | 
				
			||||||
        case QK_MOD_TAP ... QK_MOD_TAP_MAX:
 | 
					            case QK_MOD_TAP ... QK_MOD_TAP_MAX:
 | 
				
			||||||
            // Earlier return if this has not been considered tapped yet
 | 
					            case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
 | 
				
			||||||
            if (record->tap.count == 0) { return true; }
 | 
					                // Earlier return if this has not been considered tapped yet
 | 
				
			||||||
            keycode = keycode & 0xFF;
 | 
					                if (record->tap.count == 0) { return true; }
 | 
				
			||||||
            break;
 | 
					                keycode = tap_hold_extractor(keycode);
 | 
				
			||||||
        case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:  // `LT(layer, key)` keys.
 | 
					                break;
 | 
				
			||||||
            // Release event on a held layer-tap key when numword is on.
 | 
					    /*         case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:  // `LT(layer, key)` keys.
 | 
				
			||||||
            if (record->tap.count == 0 && !record->event.pressed && is_num_word_on) {     
 | 
					                // Release event on a held layer-tap key when numword is on.
 | 
				
			||||||
                return false;  // Skip default handling so that layer stays on.
 | 
					                if (record->tap.count == 0 && !record->event.pressed) {     
 | 
				
			||||||
            } else {
 | 
					                    return false;  // Skip default handling so that layer stays on.
 | 
				
			||||||
                keycode = keycode & 0xFF;    // Get tapping keycode.
 | 
					                } else {
 | 
				
			||||||
            }
 | 
					                    keycode = keycode & 0xFF;    // Get tapping keycode.
 | 
				
			||||||
            break;
 | 
					                }
 | 
				
			||||||
/*         default:
 | 
					                break; */
 | 
				
			||||||
            break; */
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        exit_num_word = should_exit_num_word(keycode, record);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (exit_num_word) { disable_num_word(); }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    exit_num_word = should_exit_num_word(keycode, record);
 | 
					 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,6 +69,8 @@ bool is_followed_by_apos(uint16_t keycode, uint16_t prev_keycode) {
 | 
				
			||||||
// even if the tap/hold key is a custom one, with non-basic tap keycode.
 | 
					// even if the tap/hold key is a custom one, with non-basic tap keycode.
 | 
				
			||||||
uint16_t tap_hold_extractor(uint16_t keycode) {
 | 
					uint16_t tap_hold_extractor(uint16_t keycode) {
 | 
				
			||||||
  switch (keycode) {
 | 
					  switch (keycode) {
 | 
				
			||||||
 | 
					    case LT_NBSPC:
 | 
				
			||||||
 | 
					      return NNB_SPC;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      return keycode &= 0xff;
 | 
					      return keycode &= 0xff;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -80,21 +82,21 @@ bool process_custom_tap_hold(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
    switch (keycode) {
 | 
					    switch (keycode) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case RCTL_T(FEN_B):
 | 
					        case RCTL_T(FEN_B):
 | 
				
			||||||
            return process_tap_hold(LWIN(KC_DOWN), record);
 | 
					          return process_tap_hold(LWIN(KC_DOWN), record);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case SFT_T(COPY):
 | 
					        case SFT_T(COPY):
 | 
				
			||||||
            return process_tap_hold(C(PG_C), record);
 | 
					          return process_tap_hold(C(PG_C), record);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*         case LT_NUMWORD:
 | 
					        case LT_NBSPC:
 | 
				
			||||||
            return process_numword(NUMWORD, record); */
 | 
					          return process_tap_hold(NNB_SPC, record);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case LT_REPT:
 | 
					        case LT_REPT:
 | 
				
			||||||
            repeat_key_invoke(&record->event);
 | 
					          repeat_key_invoke(&record->event);
 | 
				
			||||||
            return false;
 | 
					          return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case LT_MGC:
 | 
					        case LT_MGC:
 | 
				
			||||||
            alt_repeat_key_invoke(&record->event);
 | 
					          alt_repeat_key_invoke(&record->event);
 | 
				
			||||||
            return false;
 | 
					          return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return true; // Process all other keycodes normally
 | 
					  return true; // Process all other keycodes normally
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,326 +0,0 @@
 | 
				
			||||||
/* Copyright 2019 Thomas Baart <thomas@splitkb.com>
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#include QMK_KEYBOARD_H
 | 
					 | 
				
			||||||
#include "keymap.h"
 | 
					 | 
				
			||||||
#include "features/layer_lock.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool is_caps_lock_on(void) { return host_keyboard_led_state().caps_lock; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool is_letter(uint16_t keycode) {
 | 
					 | 
				
			||||||
  switch (keycode) {
 | 
					 | 
				
			||||||
    case KC_A ... KC_L:
 | 
					 | 
				
			||||||
    case PG_M:
 | 
					 | 
				
			||||||
    case KC_N ... KC_Z:
 | 
					 | 
				
			||||||
    case PG_AGRV:
 | 
					 | 
				
			||||||
    case PG_U:
 | 
					 | 
				
			||||||
    case PG_EGRV:
 | 
					 | 
				
			||||||
    case PG_CCED:
 | 
					 | 
				
			||||||
      return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
      return false;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Achordion
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint16_t achordion_timeout(uint16_t tap_hold_keycode) { return 500; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool achordion_eager_mod(uint8_t mod) {
 | 
					 | 
				
			||||||
  switch (mod) {
 | 
					 | 
				
			||||||
    case MOD_LSFT:
 | 
					 | 
				
			||||||
    case MOD_RSFT:
 | 
					 | 
				
			||||||
    case MOD_LCTL:
 | 
					 | 
				
			||||||
    case MOD_RCTL:
 | 
					 | 
				
			||||||
      return true;  // Eagerly apply Shift and Ctrl mods.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
      return false;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Caps Word
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool caps_word_press_user(uint16_t keycode) {
 | 
					 | 
				
			||||||
  // Keycodes that continue Caps Word, with shift applied.
 | 
					 | 
				
			||||||
  if (is_letter(keycode)) {
 | 
					 | 
				
			||||||
    add_weak_mods(MOD_BIT(KC_LSFT));  // Apply shift to next key.
 | 
					 | 
				
			||||||
    return true;
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    switch (keycode) {
 | 
					 | 
				
			||||||
        // Keycodes that continue Caps Word, without shifting.
 | 
					 | 
				
			||||||
        case PG_MOIN:
 | 
					 | 
				
			||||||
        case KC_KP_1 ... KC_KP_0:
 | 
					 | 
				
			||||||
        case KC_LEFT:
 | 
					 | 
				
			||||||
        case KC_RIGHT:
 | 
					 | 
				
			||||||
        case KC_BSPC:
 | 
					 | 
				
			||||||
        case KC_DEL:
 | 
					 | 
				
			||||||
        case PG_APOS:
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            return false;  // Deactivate Caps Word.
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Combo
 | 
					 | 
				
			||||||
combo_t key_combos[] = {};
 | 
					 | 
				
			||||||
uint16_t COMBO_LEN = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Custom altGr keys
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const custom_altgr_key_t custom_altgr_keys[] = {
 | 
					 | 
				
			||||||
  {PG_AGRV, PG_AE},
 | 
					 | 
				
			||||||
  {PG_B, PG_TS},
 | 
					 | 
				
			||||||
  {PG_A, PG_CDAQ},
 | 
					 | 
				
			||||||
  {PG_I, PG_RDAQ},
 | 
					 | 
				
			||||||
  {PG_N, PG_ESPR},
 | 
					 | 
				
			||||||
  {PG_T, PG_AROB},
 | 
					 | 
				
			||||||
  {ALGR_T(PG_A), PG_CDAQ},
 | 
					 | 
				
			||||||
  {LCTL_T(PG_I), PG_RDAQ},
 | 
					 | 
				
			||||||
  {RCTL_T(PG_N), PG_ESPR},
 | 
					 | 
				
			||||||
  {ALGR_T(PG_T), PG_AROB},
 | 
					 | 
				
			||||||
  {PG_POIN, PG_NM},
 | 
					 | 
				
			||||||
  {KC_KP_8, PG_INFN},
 | 
					 | 
				
			||||||
  {PG_F, PG_HASH},
 | 
					 | 
				
			||||||
  {PG_G, PG_HEG},
 | 
					 | 
				
			||||||
  {PG_CCED, PG_DEDL},
 | 
					 | 
				
			||||||
  {PG_Q, PG_TECT},
 | 
					 | 
				
			||||||
  {PG_X, PG_PVIR},
 | 
					 | 
				
			||||||
  {PG_D, PG_DOPY},
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint8_t NUM_CUSTOM_ALTGR_KEYS =
 | 
					 | 
				
			||||||
    sizeof(custom_altgr_keys) / sizeof(custom_altgr_key_t);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void matrix_scan_user(void) {
 | 
					 | 
				
			||||||
  //achordion_task();
 | 
					 | 
				
			||||||
  recent_keys_task();
 | 
					 | 
				
			||||||
  swapper_task();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Tap-hold configuration
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Handle keyrecord before quantum processing
 | 
					 | 
				
			||||||
static uint16_t next_keycode;
 | 
					 | 
				
			||||||
static keyrecord_t next_record;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool pre_process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
					 | 
				
			||||||
    static uint16_t prev_keycode;
 | 
					 | 
				
			||||||
    static bool tap_condition;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (record->event.pressed) {
 | 
					 | 
				
			||||||
        // Store the previous keycode for instant tap decision
 | 
					 | 
				
			||||||
        prev_keycode = next_keycode;
 | 
					 | 
				
			||||||
        // Cache the next input for mod-tap decisions
 | 
					 | 
				
			||||||
        next_keycode = keycode;
 | 
					 | 
				
			||||||
        next_record  = *record;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Match mod-tap keys. Tweak this to limit conditions that matches your keyboard and habits.
 | 
					 | 
				
			||||||
    tap_condition = ((IS_LAYER_ON(_BASE)) && IS_QK_MOD_TAP(keycode) && !IS_QK_LAYER_TAP(prev_keycode) && !is_mod_tap_control(prev_keycode));
 | 
					 | 
				
			||||||
    return process_instant_tap(keycode, record, prev_keycode, tap_condition);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool forbidden_chord(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record, uint16_t other_keycode, keyrecord_t* other_record) {
 | 
					 | 
				
			||||||
  switch (tap_hold_keycode) {
 | 
					 | 
				
			||||||
    case LT_VIRG:
 | 
					 | 
				
			||||||
    case OSM(MOD_LSFT):
 | 
					 | 
				
			||||||
    case OSM(MOD_RSFT):
 | 
					 | 
				
			||||||
      return false;   
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
      // Otherwise, follow the opposite hands rule.
 | 
					 | 
				
			||||||
      return same_side_combination(tap_hold_record, other_record);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool first_of_chorded_mods(uint16_t keycode) {
 | 
					 | 
				
			||||||
  switch (keycode) {
 | 
					 | 
				
			||||||
    case LT_TAB:    // Pour pouvoir faire OSM shift + LT_TAB (win + shift + flèche).
 | 
					 | 
				
			||||||
    case PG_CCED:   // Pour pouvoir faire Alt + F4, Alt + F11.
 | 
					 | 
				
			||||||
    case LCTL_T(PG_I):
 | 
					 | 
				
			||||||
    case RCTL_T(PG_N):
 | 
					 | 
				
			||||||
    case OSM(MOD_LSFT):   // Pour pouvoir faire OSM shift + LT_TAB (win + shift + flèche).
 | 
					 | 
				
			||||||
      return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
      return false;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (record->event.key.col != next_record.event.key.col) {
 | 
					 | 
				
			||||||
      // Sinon on a des effets de bord quand on veut taper des chiffres. 
 | 
					 | 
				
			||||||
      if (IS_LAYER_ON(_BASE)) {
 | 
					 | 
				
			||||||
        // When a mod-tap key overlaps with another non-Ctrl key on the same hand, send its base keycode
 | 
					 | 
				
			||||||
        if (forbidden_chord(keycode, record, next_keycode, &next_record) && !first_of_chorded_mods(keycode)) {
 | 
					 | 
				
			||||||
          tap_converter(keycode, record);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (forbidden_chord(keycode, record, next_keycode, &next_record)) {
 | 
					 | 
				
			||||||
      tap_converter(keycode, record);
 | 
					 | 
				
			||||||
      return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return true;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Achordion
 | 
					 | 
				
			||||||
  //if (!process_achordion(keycode, record)) { return false; }
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  // Custom alt gr
 | 
					 | 
				
			||||||
  if (!process_custom_altgr_keys(keycode, record)) { return false; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Recent keys
 | 
					 | 
				
			||||||
  if (!process_clever_keys(keycode, record)) { return false; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Numword
 | 
					 | 
				
			||||||
  if (!process_numword(keycode, record)) { return false; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Layer lock
 | 
					 | 
				
			||||||
  if (!process_layer_lock(keycode, record, LAYER_LCK)) { return false; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Select word
 | 
					 | 
				
			||||||
  if (!process_select_word(keycode, record, SELWORD)) { return false; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Macros
 | 
					 | 
				
			||||||
  if (!process_macros(keycode, record)) { return false; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return true; // Process all other keycodes normally
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Base Layer: ALPHAS
 | 
					 | 
				
			||||||
 *»\
 | 
					 | 
				
			||||||
 * ,-------------------------------------------.                              ,-------------------------------------------.
 | 
					 | 
				
			||||||
 * | Helpsc |   À  |   B  |   É  |   .  |   -  |                              |   ^  |   V  |   L  |   M  |   X  |    W   |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|0
 | 
					 | 
				
			||||||
 * |  Enter |   O  |   U  |A/AltG|I/Ctrl|   J  |                              |   G  |   T  |   S  |   N  |   R  |    F   |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
 * |  Tab   |   Q  |   Y  |   È  |P/Win |  ""  | Bksp | End  |  | Home |Delete|   K  |   D  |   Z  |   H  |   C  | Ç/Alt  |
 | 
					 | 
				
			||||||
 * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | 
					 | 
				
			||||||
 *                        |NavNum| Space|Shift |   E  | ,    |  |  '   | Space|Shift| Win  | Mute |
 | 
					 | 
				
			||||||
 *                        |      |      |      |NavNum|Symb. |  |Funct.|NavNum|     |      |      |
 | 
					 | 
				
			||||||
 *                        `----------------------------------'  `----------------------------------'
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
    [_BASE] = LAYOUT(
 | 
					 | 
				
			||||||
      KC_ESC, PG_AGRV,     PG_B,        PG_U,      PG_X,       PG_MOIN,                                                               PG_ACIR,       PG_G,         PG_C,         PG_M,        PG_POIN,         PG_W,
 | 
					 | 
				
			||||||
      KC_ENT, ALT_T(PG_O), SFT_T(PG_L), ALGR_T(PG_A), LCTL_T(PG_I),  PG_J,                                                                  PG_VIRG,          RCTL_T(PG_N), ALGR_T(PG_T), RSFT_T(PG_S), ALT_T(PG_R), PG_V,
 | 
					 | 
				
			||||||
      LT_TAB, PG_Q,        PG_Y,        PG_EGRV,      LWIN_T(PG_P),  PG_HQUO,       KC_BSPC,          KC_END,  KC_HOME, KC_DEL,             PG_K,          RWIN_T(PG_H), PG_Z,         PG_F,        PG_D,         PG_CCED,
 | 
					 | 
				
			||||||
                                        TG(_SYMBOLS),  KC_SPC,        OSM(MOD_LSFT), LT(_SYMBOLS,PG_E), LT_VIRG, LT_APOS, LT(_SYMBOLS,KC_SPC), OSM(MOD_RSFT), KC_RGUI,      KC_MUTE
 | 
					 | 
				
			||||||
    ),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	  
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Layer 1 : Numpad + symbols
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * ,-------------------------------------------.                              ,-------------------------------------------.
 | 
					 | 
				
			||||||
 * | Helpsc |  !   |  ?   |  &   |  ;   |  |   |                              |   ⁻  |  7   |  8   |  9   |  *   |NumLock |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
 * |        |  {   |  }   |  (   |  )   | LOCK |                              |   =  |  4   |  5   |  6   |  /   |   \    |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
 * |        |  [   |  ]   |  <   |  >   |Indice|      |      |  |      |      |Expos.|  1   |  2   |  3   |  +   |   %    |
 | 
					 | 
				
			||||||
 * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | 
					 | 
				
			||||||
 *                        |      |      |      |      |      |  |      |   0  |   .  |      |      |
 | 
					 | 
				
			||||||
 *                        |      |      |      |      |      |  |   ,  |      |      |      |      |
 | 
					 | 
				
			||||||
 *                        `----------------------------------'  `----------------------------------'
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
    [_SYMBOLS] = LAYOUT(
 | 
					 | 
				
			||||||
      KC_ESC,  PG_EXCL, PG_QUES,        PG_ESPR,         PG_PVIR, PG_PIPE,                                       PG_MOIN, KC_P7,         KC_P8,         KC_P9, PG_ASTX, KC_NUM,
 | 
					 | 
				
			||||||
      _______, PG_CACL, SFT_T(PG_RACL), ALGR_T(PG_LPRN), PG_RPRN, LAYER_LCK,                                     PG_EGAL, RCTL_T(KC_P4), ALGR_T(KC_P5), KC_P6, PG_TLSH, PG_BSLS,
 | 
					 | 
				
			||||||
      _______, PG_CBKT, PG_RBKT,        PG_INF,          PG_SUP,  PG_CARN,   _______, _______, _______, _______, PG_ACIR, KC_P1,         KC_P2,         KC_P3, PG_PLUS, PG_PERC,
 | 
					 | 
				
			||||||
                                        _______,         _______, _______,   KC_SPC,  PG_EACU, NUMWORD, KC_P0,   KC_PDOT, _______      , _______
 | 
					 | 
				
			||||||
    ),
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Layer 2 : Symbols + function keys
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * ,-------------------------------------------.                              ,-------------------------------------------.
 | 
					 | 
				
			||||||
 * | Helpsc |  F1  |  F2  |  F3  |  F4  |  F5  |                              |      |   ;  |   !  |   #  |   °  |        |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
 * |        |Ctrl A|Ctrl X|Ctrl V|Ctrl C| LOCK |                              | Mute |   (  |   )  |   @  |   &  |  Mute  |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
 * |        |  F6  |  F7  |  F8  |  F9  |  F10 |      |      |  |      |      |      |Ctrl Z|Ctrl Y|  F11 |  F12 |        |
 | 
					 | 
				
			||||||
 * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | 
					 | 
				
			||||||
 *                        |      |      |      |      |      |  |      |      |      |      |      |
 | 
					 | 
				
			||||||
 *                        |      |      |      |      |      |  | !!!  |   ,  |      |      |      |
 | 
					 | 
				
			||||||
 *                        `----------------------------------'  `----------------------------------'
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
    [_SHORTNAV] = LAYOUT(
 | 
					 | 
				
			||||||
      KC_ESC,  A(KC_F4), ALT_TAB,      LWIN(PG_G), _______, _______,                                           _______, C(KC_LEFT),      KC_UP,   C(KC_RIGHT), _______, _______,
 | 
					 | 
				
			||||||
      _______, C(PG_A),  C(PG_POIN),      C(PG_G),    C(PG_D), LAYER_LCK,                                         KC_MUTE, RCTL_T(KC_LEFT), KC_DOWN, KC_RIGHT,    KC_F2  , KC_MUTE,
 | 
					 | 
				
			||||||
      _______, SELWORD,  LWIN(KC_TAB), REV_TAB,    ALT_TAB, _______,  _______, S(KC_END), S(KC_HOME), _______, _______, C(PG_Z),         C(PG_Y), _______,     _______, _______,
 | 
					 | 
				
			||||||
                                       _______,    _______, _______,  QUES_PT, QUES_PT,   EXCL_PT,    EXCL_PT, _______, _______,         _______
 | 
					 | 
				
			||||||
    ),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Layer 3 : Function keys + windows management
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * ,-------------------------------------------.                              ,-------------------------------------------.
 | 
					 | 
				
			||||||
 * |        |  F12 |  F7  |  F8  |  F9  |      |                              |      |      |      |      |      |        |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
 * |        |  F11 |  F4  |  F5  |  F6  | LOCK |                              |      |      |      |      |      |        |
 | 
					 | 
				
			||||||
 * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
 * |        |  F10 |  F1  |  F2  |  F3  |      |      |      |  |      |      |      |      |      |      |      |        |
 | 
					 | 
				
			||||||
 * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | 
					 | 
				
			||||||
 *                        |      |      |      |      |      |  |      |      |      |      |      |
 | 
					 | 
				
			||||||
 *                        |      |      |      |      |      |  |      |      |      |      |      |
 | 
					 | 
				
			||||||
 *                        `----------------------------------'  `----------------------------------'
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
    [_FUNCAPPS] = LAYOUT(
 | 
					 | 
				
			||||||
      KC_ESC,  KC_F12,        KC_F9,         KC_F8,   KC_F7,   C(KC_PAUS),                                     _______, SWIN(KC_LEFT), LWIN(KC_UP),   SWIN(KC_RIGHT), _______, QK_BOOT,
 | 
					 | 
				
			||||||
      _______, ALT_T(KC_F11), SFT_T(KC_F6),  KC_F5,   KC_F4,   LAYER_LCK,                                      _______, RCTL_T(FEN_G), LWIN(KC_DOWN), LWIN(KC_RIGHT), _______, _______,
 | 
					 | 
				
			||||||
      _______, KC_F10,        KC_F3,         KC_F2,   KC_F1,   _______,    _______, _______, _______, _______, _______, LWIN(PG_H),    LWIN(KC_HOME), _______,        _______, _______,
 | 
					 | 
				
			||||||
                                             _______, _______, _______,    _______, _______, _______, _______, _______, _______,       _______
 | 
					 | 
				
			||||||
    ),
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// /*
 | 
					 | 
				
			||||||
//  * Layer template
 | 
					 | 
				
			||||||
//  *
 | 
					 | 
				
			||||||
//  * ,-------------------------------------------.                              ,-------------------------------------------.
 | 
					 | 
				
			||||||
//  * |        |      |      |      |      |      |                              |      |      |      |      |      |        |
 | 
					 | 
				
			||||||
//  * |--------+------+------+------+------+------|                              |------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
//  * |        |      |      |      |      |      |                              |      |      |      |      |      |        |
 | 
					 | 
				
			||||||
//  * |--------+------+------+------+------+------+-------------.  ,-------------+------+------+------+------+------+--------|
 | 
					 | 
				
			||||||
//  * |        |      |      |      |      |      |      |      |  |      |      |      |      |      |      |      |        |
 | 
					 | 
				
			||||||
//  * `----------------------+------+------+------+------+------|  |------+------+------+------+------+----------------------'
 | 
					 | 
				
			||||||
//  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | 
					 | 
				
			||||||
//  *                        |      |      |      |      |      |  |      |      |      |      |      |
 | 
					 | 
				
			||||||
//  *                        `----------------------------------'  `----------------------------------'
 | 
					 | 
				
			||||||
//  */
 | 
					 | 
				
			||||||
//     [_LAYERINDEX] = LAYOUT(
 | 
					 | 
				
			||||||
//       _______, _______, _______, _______, _______, _______,                                     _______, _______, _______, _______, _______, _______,
 | 
					 | 
				
			||||||
//       _______, _______, _______, _______, _______, _______,                                     _______, _______, _______, _______, _______, _______,
 | 
					 | 
				
			||||||
//       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
					 | 
				
			||||||
//                                  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
					 | 
				
			||||||
//     ),
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
| 
						 | 
					@ -106,17 +106,17 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||||
  // Custom behaviour of the typo dead-key
 | 
					  // Custom behaviour of the typo dead-key
 | 
				
			||||||
  if (!process_odk_layer(keycode, record)) { return false; }
 | 
					  if (!process_odk_layer(keycode, record)) { return false; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Clever keys
 | 
					  // Clever keys
 | 
				
			||||||
  if (!process_clever_keys(keycode, record)) { return false; }
 | 
					  if (!process_clever_keys(keycode, record)) { return false; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Process all other keycodes normally
 | 
					  // Process all other keycodes normally
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void post_process_record_user(uint16_t keycode, keyrecord_t* record) {
 | 
					void post_process_record_user(uint16_t keycode, keyrecord_t* record) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  os4a_layer_exit_check();
 | 
					  os4a_layer_exit_check();
 | 
				
			||||||
  numword_exit_check();
 | 
					  //numword_exit_check();
 | 
				
			||||||
  end_CK(record);
 | 
					  end_CK(record);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -203,10 +203,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||||
 *                        `----------------------------------'  `----------------------------------'
 | 
					 *                        `----------------------------------'  `----------------------------------'
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    [_SYMBOLS] = LAYOUT(
 | 
					    [_SYMBOLS] = LAYOUT(
 | 
				
			||||||
      _______, PG_ACIR,    PG_LCBR, PG_RCBR, PG_DLR,  PG_PERC,                                           PG_HASH, PG_DQUO, PG_EGAL, ALGR(PG_J), PG_GRV,  _______,
 | 
					      _______, PG_ACIR,    PG_LCBR, PG_RCBR, PG_DLR,  PG_PERC,                                     PG_HASH, PG_DQUO, PG_EGAL, ALGR(PG_J), PG_GRV,  _______,
 | 
				
			||||||
      _______, ALGR(PG_O), PG_LPRN, PG_RPRN, PG_PVIR, PG_2PTS,                                           PG_BSLS, MT_SLSH, PG_MOIN, PG_PLUS,    PG_ASTX, _______,
 | 
					      _______, ALGR(PG_O), PG_LPRN, PG_RPRN, PG_PVIR, PG_2PTS,                                     PG_BSLS, MT_SLSH, PG_MOIN, PG_PLUS,    PG_ASTX, _______,
 | 
				
			||||||
      _______, PG_INF,     PG_LSBR, PG_RSBR, PG_SUP,  _______,       _______, _______, _______, _______, _______, PG_APOD, PG_ESPR, PG_PIPE,    PG_TILD, _______,
 | 
					      _______, PG_INF,     PG_LSBR, PG_RSBR, PG_SUP,  _______, _______, _______, _______, _______, _______, PG_APOD, PG_ESPR, PG_PIPE,    PG_TILD, _______,
 | 
				
			||||||
                                    _______, _______, _______,       PG_UNDS, KC_SPC,  _______, _______, _______, _______, _______
 | 
					                                    _______, _______, _______, PG_UNDS, KC_SPC,  _______, _______, _______, _______, _______
 | 
				
			||||||
    ),
 | 
					    ),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -225,10 +225,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||||
 *                        `----------------------------------'  `----------------------------------'
 | 
					 *                        `----------------------------------'  `----------------------------------'
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    [_NUMBERS] = LAYOUT(
 | 
					    [_NUMBERS] = LAYOUT(
 | 
				
			||||||
       _______, PG_DLR,  PG_MOIN, PG_PLUS, _______, PG_PERC,                                           PG_EXP,  _______, PG_EGAL, PG_ASTX, _______, _______,
 | 
					       _______, PG_DLR,  PG_MOIN, PG_PLUS, PG_EURO, PG_PERC,                                      PG_EXP,  _______, PG_EGAL, PG_ASTX, _______, _______,
 | 
				
			||||||
       _______, KC_4,    KC_3,    KC_2,    MT_1,    PG_2PTS,                                           PG_IND,  MT_SLSH, KC_6,    KC_7,    KC_8,    _______,
 | 
					       _______, KC_4,    KC_3,    KC_2,    MT_1,    PG_2PTS,                                      PG_IND,  MT_SLSH, KC_6,    KC_7,    KC_8,    _______,
 | 
				
			||||||
       _______, _______, _______, PG_H,    KC_5,    _______,       _______, _______, _______, _______, _______, KC_9,    PG_DEG,  _______, PG_ODK,  _______,
 | 
					       _______, _______, _______, PG_H,    KC_5,    _______, _______, _______,  _______, _______, _______, KC_9,    PG_DEG,  _______, PG_ODK,  _______,
 | 
				
			||||||
                                  _______, _______, KC_PDOT,       KC_0   , LT_EURO, NNB_SPC, KC_SPC,  KC_PDOT, _______, _______
 | 
					                                  _______, _______, KC_PDOT, KC_0   , LT_NBSPC, _______, KC_SPC,  _______, _______, _______
 | 
				
			||||||
     ),
 | 
					     ),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -269,7 +269,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||||
 *                        `----------------------------------'  `----------------------------------'
 | 
					 *                        `----------------------------------'  `----------------------------------'
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    [_SHORTNAV] = LAYOUT(
 | 
					    [_SHORTNAV] = LAYOUT(
 | 
				
			||||||
      _______, KC_BSPC, LWIN(KC_TAB), LWIN(PG_V), RCS(PG_V),   KC_VOLU,                                      KC_PGUP, C(KC_LEFT), KC_UP,      C(KC_RGHT), _______, _______,
 | 
					      _______, _______, LWIN(KC_TAB), LWIN(PG_V), RCS(PG_V),   KC_VOLU,                                      KC_PGUP, C(KC_LEFT), KC_UP,      C(KC_RGHT), _______, _______,
 | 
				
			||||||
      _______, C(PG_A), C(PG_X),      C(PG_V),    SFT_T(COPY), KC_VOLD,                                      KC_PGDN, KC_LEFT,    KC_DOWN,    KC_RIGHT,   KC_F2  , _______,
 | 
					      _______, C(PG_A), C(PG_X),      C(PG_V),    SFT_T(COPY), KC_VOLD,                                      KC_PGDN, KC_LEFT,    KC_DOWN,    KC_RIGHT,   KC_F2  , _______,
 | 
				
			||||||
      _______, KC_SPC,  KC_SPC,       KC_MUTE,    C(PG_Z),     C(PG_Y),  _______, _______, _______, _______, _______, C(KC_PGUP), C(KC_PGDN), C(PG_W),    _______, _______,
 | 
					      _______, KC_SPC,  KC_SPC,       KC_MUTE,    C(PG_Z),     C(PG_Y),  _______, _______, _______, _______, _______, C(KC_PGUP), C(KC_PGDN), C(PG_W),    _______, _______,
 | 
				
			||||||
                                      _______,    _______,     _______,  _______, _______, _______, _______, _______, _______,    _______
 | 
					                                      _______,    _______,     _______,  _______, _______, _______, _______, _______, _______,    _______
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,20 +53,12 @@ enum custom_keycodes {
 | 
				
			||||||
  RAZ,
 | 
					  RAZ,
 | 
				
			||||||
  CAPSWORD,
 | 
					  CAPSWORD,
 | 
				
			||||||
  OU_GRV,
 | 
					  OU_GRV,
 | 
				
			||||||
  //PG_OE,
 | 
					 | 
				
			||||||
  //E_CIRC,
 | 
					 | 
				
			||||||
/*  I_CIRC,
 | 
					 | 
				
			||||||
  A_CIRC,
 | 
					 | 
				
			||||||
  O_CIRC,
 | 
					 | 
				
			||||||
  U_CIRC,
 | 
					 | 
				
			||||||
  I_TREM,*/
 | 
					 | 
				
			||||||
  MAGIC,
 | 
					  MAGIC,
 | 
				
			||||||
  OS_SHFT,
 | 
					  OS_SHFT,
 | 
				
			||||||
  OS_CTRL,
 | 
					  OS_CTRL,
 | 
				
			||||||
  OS_RALT,
 | 
					  OS_RALT,
 | 
				
			||||||
  OS_LALT,
 | 
					  OS_LALT,
 | 
				
			||||||
  OS_WIN,
 | 
					  OS_WIN,
 | 
				
			||||||
  //OS_ODK,
 | 
					 | 
				
			||||||
  CNL_ODK,
 | 
					  CNL_ODK,
 | 
				
			||||||
  TG_APOS,
 | 
					  TG_APOS,
 | 
				
			||||||
  PG_DEG
 | 
					  PG_DEG
 | 
				
			||||||
| 
						 | 
					@ -81,8 +73,7 @@ enum custom_keycodes {
 | 
				
			||||||
#define TT_FA TT(_FUNCAPPS)
 | 
					#define TT_FA TT(_FUNCAPPS)
 | 
				
			||||||
#define MT_SLSH SFT_T(PG_SLSH)
 | 
					#define MT_SLSH SFT_T(PG_SLSH)
 | 
				
			||||||
#define MT_1 SFT_T(KC_1)
 | 
					#define MT_1 SFT_T(KC_1)
 | 
				
			||||||
//#define LT_NUMWORD LT(_SHORTNAV, NUMWORD)
 | 
					#define LT_NBSPC LT(_SHORTNAV, NNB_SPC)
 | 
				
			||||||
#define LT_EURO LT(_SHORTNAV, PG_EURO)
 | 
					 | 
				
			||||||
#define E_CIRC S(FG_0)
 | 
					#define E_CIRC S(FG_0)
 | 
				
			||||||
#define OS_ODK OSL(_ODK)
 | 
					#define OS_ODK OSL(_ODK)
 | 
				
			||||||
#define OS_RSA OSM(MOD_RALT | MOD_LSFT)
 | 
					#define OS_RSA OSM(MOD_RALT | MOD_LSFT)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@
 | 
				
			||||||
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
 | 
					 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
 | 
				
			||||||
 * │     │ , │ É │ U │ P │ - │ V │ M │ C │ J │ X │ ' │ - │     │
 | 
					 * │     │ , │ É │ U │ P │ - │ V │ M │ C │ J │ X │ ' │ - │     │
 | 
				
			||||||
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
 | 
					 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
 | 
				
			||||||
 * │      │ O │ A │ I │ N │ . │ G │ T │ S │ R │ L │ ’ │ € │    │
 | 
					 * │      │ O │ A │ I │ N │ . │ G │ T │ S │ R │ L │ _ │ ’ │    │
 | 
				
			||||||
 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
 | 
					 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
 | 
				
			||||||
 * │    │ E │ Q │ Z │ Y │ H │ B │ K │ D │ F │ W │ **│          │
 | 
					 * │    │ E │ Q │ Z │ Y │ H │ B │ K │ D │ F │ W │ **│          │
 | 
				
			||||||
 * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
 | 
					 * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@
 | 
				
			||||||
#define PG_S    KC_K    // S
 | 
					#define PG_S    KC_K    // S
 | 
				
			||||||
#define PG_R    KC_L    // R
 | 
					#define PG_R    KC_L    // R
 | 
				
			||||||
#define PG_L    KC_SCLN // L
 | 
					#define PG_L    KC_SCLN // L
 | 
				
			||||||
#define PG_EURO KC_QUOT // €
 | 
					#define PG_UNDS KC_QUOT // _
 | 
				
			||||||
#define PG_APOS KC_NUHS // ’
 | 
					#define PG_APOS KC_NUHS // ’
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Row 4
 | 
					// Row 4
 | 
				
			||||||
| 
						 | 
					@ -95,7 +95,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Shifted symbols
 | 
					/* Shifted symbols
 | 
				
			||||||
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
 | 
					 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
 | 
				
			||||||
 * │ ~ │ | │ < │ > │ $ │ % │ ^ │ & │ _ │ # │ @ │ * │ \ │       │
 | 
					 * │ ~ │ € │ < │ > │ $ │ % │ ^ │ & │ | │ # │ @ │ * │ \ │       │
 | 
				
			||||||
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
 | 
					 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
 | 
				
			||||||
 * │     │ ? │   │   │   │ ! │   │   │   │   │   │ " │ + │     │
 | 
					 * │     │ ? │   │   │   │ ! │   │   │   │   │   │ " │ + │     │
 | 
				
			||||||
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
 | 
					 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
 | 
				
			||||||
| 
						 | 
					@ -109,14 +109,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Row 1
 | 
					// Row 1
 | 
				
			||||||
#define PG_TILD S(KC_GRV)  // ~
 | 
					#define PG_TILD S(KC_GRV)  // ~
 | 
				
			||||||
#define PG_PIPE S(KC_1)    // |
 | 
					#define PG_EURO S(KC_1)    // €
 | 
				
			||||||
#define PG_INF  S(KC_2)    // <
 | 
					#define PG_INF  S(KC_2)    // <
 | 
				
			||||||
#define PG_SUP  S(KC_3)    // >
 | 
					#define PG_SUP  S(KC_3)    // >
 | 
				
			||||||
#define PG_DLR  S(KC_4)    // $
 | 
					#define PG_DLR  S(KC_4)    // $
 | 
				
			||||||
#define PG_PERC S(KC_5)    // %
 | 
					#define PG_PERC S(KC_5)    // %
 | 
				
			||||||
#define PG_ACIR S(KC_6)    // ^
 | 
					#define PG_ACIR S(KC_6)    // ^
 | 
				
			||||||
#define PG_ESPR S(KC_7)    // &
 | 
					#define PG_ESPR S(KC_7)    // &
 | 
				
			||||||
#define PG_UNDS S(KC_8)    // _
 | 
					#define PG_PIPE S(KC_8)    // |
 | 
				
			||||||
#define PG_HASH S(KC_9)    // #
 | 
					#define PG_HASH S(KC_9)    // #
 | 
				
			||||||
#define PG_AROB S(KC_0)    // @
 | 
					#define PG_AROB S(KC_0)    // @
 | 
				
			||||||
#define PG_ASTX S(PG_SLSH) // *
 | 
					#define PG_ASTX S(PG_SLSH) // *
 | 
				
			||||||
| 
						 | 
					@ -132,7 +132,7 @@
 | 
				
			||||||
// Row 3
 | 
					// Row 3
 | 
				
			||||||
#define PG_2PTS S(PG_POIN) // :
 | 
					#define PG_2PTS S(PG_POIN) // :
 | 
				
			||||||
#define PG_RSBR S(PG_APOS) // ]
 | 
					#define PG_RSBR S(PG_APOS) // ]
 | 
				
			||||||
#define PG_LSBR S(PG_EURO) // [
 | 
					#define PG_LSBR S(PG_UNDS) // [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Row 4
 | 
					// Row 4
 | 
				
			||||||
#define PG_PVIR S(PG_ODK)
 | 
					#define PG_PVIR S(PG_ODK)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue