Adding Custom Shift Key Implementation for BriianPowell's Gentleman65 Keymap (#21315)
This commit is contained in:
		
							parent
							
								
									9f4f1de001
								
							
						
					
					
						commit
						ea9fa4c648
					
				
					 6 changed files with 183 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -0,0 +1,72 @@
 | 
			
		|||
// Copyright 2021-2023 Google LLC
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     https://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file custom_shift_keys.c
 | 
			
		||||
 * @brief Custom Shift Keys implementation
 | 
			
		||||
 *
 | 
			
		||||
 * For full documentation, see
 | 
			
		||||
 * <https://getreuer.info/posts/keyboards/custom-shift-keys>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "custom_shift_keys.h"
 | 
			
		||||
 | 
			
		||||
bool process_custom_shift_keys(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
    static uint16_t registered_keycode = KC_NO;
 | 
			
		||||
 | 
			
		||||
    // If a custom shift key is registered, then this event is either releasing
 | 
			
		||||
    // it or manipulating another key at the same time. Either way, we release
 | 
			
		||||
    // the currently registered key.
 | 
			
		||||
    if (registered_keycode != KC_NO) {
 | 
			
		||||
        unregister_code16(registered_keycode);
 | 
			
		||||
        registered_keycode = KC_NO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (record->event.pressed) { // Press event.
 | 
			
		||||
        const uint8_t mods = get_mods();
 | 
			
		||||
#ifndef NO_ACTION_ONESHOT
 | 
			
		||||
        if ((mods | get_weak_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT) {
 | 
			
		||||
#else
 | 
			
		||||
        if ((mods | get_weak_mods()) & MOD_MASK_SHIFT) { // Shift is held.
 | 
			
		||||
#endif // NO_ACTION_ONESHOT
 | 
			
		||||
            // Continue default handling if this is a tap-hold key being held.
 | 
			
		||||
            if ((IS_QK_MOD_TAP(keycode) || IS_QK_LAYER_TAP(keycode)) && record->tap.count == 0) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Search for a custom shift key whose keycode is `keycode`.
 | 
			
		||||
            for (int i = 0; i < NUM_CUSTOM_SHIFT_KEYS; ++i) {
 | 
			
		||||
                if (keycode == custom_shift_keys[i].keycode) {
 | 
			
		||||
                    registered_keycode = custom_shift_keys[i].shifted_keycode;
 | 
			
		||||
                    if (IS_QK_MODS(registered_keycode) && // Should keycode be shifted?
 | 
			
		||||
                        (QK_MODS_GET_MODS(registered_keycode) & MOD_LSFT) != 0) {
 | 
			
		||||
                        register_code16(registered_keycode); // If so, press it directly.
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // Otherwise cancel shift mods, press the key, and restore mods.
 | 
			
		||||
                        del_weak_mods(MOD_MASK_SHIFT);
 | 
			
		||||
#ifndef NO_ACTION_ONESHOT
 | 
			
		||||
                        del_oneshot_mods(MOD_MASK_SHIFT);
 | 
			
		||||
#endif // NO_ACTION_ONESHOT
 | 
			
		||||
                        unregister_mods(MOD_MASK_SHIFT);
 | 
			
		||||
                        register_code16(registered_keycode);
 | 
			
		||||
                        set_mods(mods);
 | 
			
		||||
                    }
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true; // Continue with default handling.
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,99 @@
 | 
			
		|||
// Copyright 2021-2022 Google LLC
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     https://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file custom_shift_keys.h
 | 
			
		||||
 * @brief Custom shift keys: customize what keycode is produced when shifted.
 | 
			
		||||
 *
 | 
			
		||||
 * Overview
 | 
			
		||||
 * --------
 | 
			
		||||
 *
 | 
			
		||||
 * This library implements custom shift keys, keys where you can customize
 | 
			
		||||
 * what keycode is produced when shifted.
 | 
			
		||||
 *
 | 
			
		||||
 * Step 1: In your keymap.c, define a table of custom shift keys like
 | 
			
		||||
 *
 | 
			
		||||
 *     #include "features/custom_shift_keys.h"
 | 
			
		||||
 *
 | 
			
		||||
 *     const custom_shift_key_t custom_shift_keys[] = {
 | 
			
		||||
 *       {KC_DOT , KC_QUES}, // Shift . is ?
 | 
			
		||||
 *       {KC_COMM, KC_EXLM}, // Shift , is !
 | 
			
		||||
 *       {KC_MINS, KC_EQL }, // Shift - is =
 | 
			
		||||
 *       {KC_COLN, KC_SCLN}, // Shift : is ;
 | 
			
		||||
 *     };
 | 
			
		||||
 *
 | 
			
		||||
 * Each row defines one key. The first field is the keycode as it appears in
 | 
			
		||||
 * your layout and determines what is typed normally. The second entry is what
 | 
			
		||||
 * you want the key to type when shifted.
 | 
			
		||||
 *
 | 
			
		||||
 * Step 2: Handle custom shift keys from your `process_record_user` function as
 | 
			
		||||
 *
 | 
			
		||||
 *     bool process_record_user(uint16_t keycode, keyrecord_t* record) {
 | 
			
		||||
 *       if (!process_custom_shift_keys(keycode, record)) { return false; }
 | 
			
		||||
 *       // Your macros ...
 | 
			
		||||
 *
 | 
			
		||||
 *       return true;
 | 
			
		||||
 *     }
 | 
			
		||||
 *
 | 
			
		||||
 * Step 3: add `features/custom_shift_keys.c` to your rules.mk as
 | 
			
		||||
 *
 | 
			
		||||
 *     SRC += features/custom_shift_keys.c
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * For full documentation, see
 | 
			
		||||
 * <https://getreuer.info/posts/keyboards/custom-shift-keys>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "quantum.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Custom shift key entry. The `keycode` field is the keycode as it appears in
 | 
			
		||||
 * your layout and determines what is typed normally. The `shifted_keycode` is
 | 
			
		||||
 * what you want the key to type when shifted.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    uint16_t keycode;
 | 
			
		||||
    uint16_t shifted_keycode;
 | 
			
		||||
} custom_shift_key_t;
 | 
			
		||||
 | 
			
		||||
/** Table of custom shift keys. */
 | 
			
		||||
extern const custom_shift_key_t custom_shift_keys[];
 | 
			
		||||
/** Number of entries in the `custom_shift_keys` table. */
 | 
			
		||||
extern uint8_t NUM_CUSTOM_SHIFT_KEYS;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler function for custom shift keys.
 | 
			
		||||
 *
 | 
			
		||||
 * In keymap.c, call this function from your `process_record_user` function as
 | 
			
		||||
 *
 | 
			
		||||
 *     #include "features/custom_shift_keys.h"
 | 
			
		||||
 *
 | 
			
		||||
 *     bool process_record_user(uint16_t keycode, keyrecord_t* record) {
 | 
			
		||||
 *       if (!process_custom_shift_keys(keycode, record)) { return false; }
 | 
			
		||||
 *       // Your macros ...
 | 
			
		||||
 *
 | 
			
		||||
 *       return true;
 | 
			
		||||
 *     }
 | 
			
		||||
 */
 | 
			
		||||
bool process_custom_shift_keys(uint16_t keycode, keyrecord_t *record);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +14,7 @@
 | 
			
		|||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#include QMK_KEYBOARD_H
 | 
			
		||||
#include "features/custom_shift_keys.h"
 | 
			
		||||
 | 
			
		||||
#define FN_ESC LT(_FUNC, KC_ESC)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +30,10 @@ enum gentleman_keycodes {
 | 
			
		|||
    FUNC,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const custom_shift_key_t custom_shift_keys[] = {{KC_ESC, KC_TILD}};
 | 
			
		||||
 | 
			
		||||
uint8_t NUM_CUSTOM_SHIFT_KEYS = sizeof(custom_shift_keys) / sizeof(custom_shift_key_t);
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		||||
	[_QWERTY] = LAYOUT_65_ansi_rwkl_split_bs(
 | 
			
		||||
		KC_ESC,   KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC,  KC_TRNS,
 | 
			
		||||
| 
						 | 
				
			
			@ -78,6 +83,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
    if (!process_custom_shift_keys(keycode, record)) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    switch (keycode) {
 | 
			
		||||
        case QWERTY:
 | 
			
		||||
            if (record->event.pressed) {
 | 
			
		||||
| 
						 | 
				
			
			@ -93,4 +101,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
			
		|||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,5 +10,5 @@
 | 
			
		|||
## Building and flashing
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
make gentleman65:briianpowell:flash
 | 
			
		||||
make jkeys_design/gentleman65:briianpowell:flash
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
SRC += features/custom_shift_keys.c
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue