Merge remote-tracking branch 'upstream/master' into develop

This commit is contained in:
Nick Brassel 2022-07-03 00:16:33 +10:00
commit ea14a93718
21 changed files with 2815 additions and 629 deletions

View file

@ -0,0 +1,39 @@
/*
Copyright 2022 Alexander Bruun <alex@bruun.xyz>
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/>.
*/
#pragma once
// Set the mouse settings to a comfortable speed/accuracy trade-off,
// assuming a screen refresh rate of 60 Htz or higher
// The default is 50. This makes the mouse ~3 times faster and more accurate
#define MOUSEKEY_INTERVAL 16
// The default is 20. Since we made the mouse about 3 times faster with the previous setting,
// give it more time to accelerate to max speed to retain precise control over short distances.
#define MOUSEKEY_TIME_TO_MAX 40
// The default is 300. Let's try and make this as low as possible while keeping the cursor responsive
#define MOUSEKEY_DELAY 100
// It makes sense to use the same delay for the mouseweel
#define MOUSEKEY_WHEEL_DELAY 100
// The default is 100
#define MOUSEKEY_WHEEL_INTERVAL 50
// The default is 40
#define MOUSEKEY_WHEEL_TIME_TO_MAX 100
// Pick good defaults for enabling homerow modifiers
#define TAPPING_TERM 200
#define PERMISSIVE_HOLD
#define IGNORE_MOD_TAP_INTERRUPT
#define TAPPING_FORCE_HOLD

View file

@ -0,0 +1,71 @@
{
"version": 1,
"notes": "Personal keymap",
"documentation": "\"This file is a QMK Configurator export. You can import this at <https://config.qmk.fm>. It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: <https://docs.qmk.fm/#/newbs>\n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n",
"keyboard": "ferris/sweep",
"keymap": "bruun-baer",
"layout": "LAYOUT_split_3x5_2",
"layers": [
["KC_Q" , "KC_D" , "KC_R" , "KC_W" , "KC_B",
"KC_J" , "KC_F" , "KC_U" , "KC_P" , "KC_QUOT",
"LGUI_T(KC_A)", "LALT_T(KC_S)", "LSFT_T(KC_H)", "LCTL_T(KC_T)" , "KC_G",
"KC_Y" , "LCTL_T(KC_N)", "LSFT_T(KC_E)", "LALT_T(KC_O)" , "LGUI_T(KC_I)",
"KC_Z" , "RALT_T(KC_X)", "KC_M" , "KC_C" , "KC_V",
"KC_K" , "KC_L" , "KC_COMM" , "RALT_T(KC_DOT)", "KC_SLSH",
"LT(3,KC_SPC)", "LT(4,KC_TAB)",
"LT(2,KC_ENT)", "LT(1,KC_BSPC)"
],
["KC_LBRC" , "KC_7" , "KC_8" , "KC_9" , "KC_RBRC",
"KC_NO" , "KC_NO" , "KC_NO" , "KC_NO" , "KC_NO",
"KC_SCLN" , "KC_4" , "KC_5" , "KC_6" , "KC_EQL",
"KC_NO" , "KC_LCTL" , "KC_LSFT" , "KC_LALT" , "KC_LGUI",
"KC_GRV" , "KC_1" , "KC_2" , "KC_3" , "KC_BSLS",
"KC_NO" , "KC_NO" , "KC_NO" , "KC_RALT" , "KC_NO",
"KC_0" , "KC_MINS",
"KC_NO" , "KC_NO"
],
["KC_LCBR" , "KC_AMPR" , "KC_ASTR" , "KC_LPRN" , "KC_RCBR",
"KC_NO" , "KC_NO" , "KC_NO" , "KC_NO" , "KC_NO",
"KC_COLN" , "KC_DLR" , "KC_PERC" , "KC_CIRC" , "KC_PLUS",
"KC_NO" , "KC_LCTL" , "KC_LSFT" , "KC_LALT" , "KC_LGUI",
"KC_TILD" , "KC_EXLM" , "KC_AT" , "KC_HASH" , "KC_PIPE",
"KC_NO" , "KC_NO" , "KC_NO" , "KC_RALT" , "KC_NO",
"KC_RPRN" , "KC_UNDS",
"KC_NO" , "KC_NO"
],
["KC_F12" , "KC_F7" , "KC_F8" , "KC_F9" , "KC_PSCR",
"KC_AGIN" , "KC_PSTE" , "KC_COPY" , "KC_CUT" , "KC_UNDO",
"KC_F11" , "KC_F4" , "KC_F5" , "KC_F6" , "KC_SCRL",
"KC_CAPS" , "KC_LEFT" , "KC_DOWN" , "KC_UP" , "KC_RGHT",
"KC_F10" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_PAUS",
"KC_INS" , "KC_HOME" , "KC_PGDN" , "KC_PGUP" , "KC_END",
"KC_NO" , "KC_NO",
"KC_ESC" , "KC_DEL"
],
["KC_NO" , "KC_NO" , "KC_NO" , "KC_NO" , "KC_NO",
"KC_MPLY" , "KC_MPRV" , "KC_VOLD" , "KC_VOLU" , "KC_MNXT",
"KC_LGUI" , "KC_LALT" , "KC_LSFT" , "KC_LCTL" , "KC_NO",
"KC_MUTE" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R",
"KC_NO" , "KC_RALT" , "KC_NO" , "KC_NO" , "KC_NO",
"KC_BTN3" , "KC_WH_L" , "KC_WH_D" , "KC_WH_U" , "KC_WH_R",
"KC_NO" , "KC_NO",
"KC_BTN1" , "KC_BTN2"
]
],
"author": "@bruun-baer"
}

View file

@ -0,0 +1,2 @@
Personal Ferris Sweep Keymap
===============================================

View file

@ -1,150 +0,0 @@
// 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.
//
//
// For full documentation, see
// https://getreuer.info/posts/keyboards/caps-word
#include "caps_word.h"
static bool caps_word_active = false;
#if CAPS_WORD_IDLE_TIMEOUT > 0
#if CAPS_WORD_IDLE_TIMEOUT < 100 || CAPS_WORD_IDLE_TIMEOUT > 30000
// Constrain timeout to a sensible range. With the 16-bit timer, the longest
// representable timeout is 32768 ms, rounded here to 30000 ms = half a minute.
#error "caps_word: CAPS_WORD_IDLE_TIMEOUT must be between 100 and 30000 ms"
#endif
static uint16_t idle_timer = 0;
void caps_word_task(void) {
if (caps_word_active && timer_expired(timer_read(), idle_timer)) {
caps_word_set(false);
}
}
#endif // CAPS_WORD_IDLE_TIMEOUT > 0
bool process_caps_word(uint16_t keycode, keyrecord_t* record) {
#ifndef NO_ACTION_ONESHOT
const uint8_t mods = get_mods() | get_oneshot_mods();
#else
const uint8_t mods = get_mods();
#endif // NO_ACTION_ONESHOT
if (!caps_word_active) {
// Pressing both shift keys at the same time enables caps word.
if ((mods & MOD_MASK_SHIFT) == MOD_MASK_SHIFT) {
caps_word_set(true); // Activate Caps Word.
return false;
}
return true;
} else {
#if CAPS_WORD_IDLE_TIMEOUT > 0
idle_timer = record->event.time + CAPS_WORD_IDLE_TIMEOUT;
#endif // CAPS_WORD_IDLE_TIMEOUT > 0
}
if (!record->event.pressed) { return true; }
if (!(mods & ~MOD_MASK_SHIFT)) {
switch (keycode) {
// Ignore MO, TO, TG, TT, and OSL layer switch keys.
case QK_MOMENTARY ... QK_MOMENTARY_MAX:
case QK_TO ... QK_TO_MAX:
case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
return true;
#ifndef NO_ACTION_TAPPING
case QK_MOD_TAP ... QK_MOD_TAP_MAX:
if (record->tap.count == 0) {
// Deactivate if a mod becomes active through holding a mod-tap key.
caps_word_set(false);
return true;
}
keycode &= 0xff;
break;
#ifndef NO_ACTION_LAYER
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
#endif // NO_ACTION_LAYER
if (record->tap.count == 0) { return true; }
keycode &= 0xff;
break;
#endif // NO_ACTION_TAPPING
#ifdef SWAP_HANDS_ENABLE
case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
if (keycode > 0x56F0 || record->tap.count == 0) { return true; }
keycode &= 0xff;
break;
#endif // SWAP_HANDS_ENABLE
}
if (caps_word_press_user(keycode)) {
return true;
}
}
caps_word_set(false); // Deactivate Caps Word.
return true;
}
void caps_word_set(bool active) {
if (active != caps_word_active) {
if (active) {
clear_mods();
#ifndef NO_ACTION_ONESHOT
clear_oneshot_mods();
#endif // NO_ACTION_ONESHOT
#if CAPS_WORD_IDLE_TIMEOUT > 0
idle_timer = timer_read() + CAPS_WORD_IDLE_TIMEOUT;
#endif // CAPS_WORD_IDLE_TIMEOUT > 0
} else if ((get_weak_mods() & MOD_BIT(KC_LSFT)) != 0) {
// If the weak shift mod is still on, turn it off and send an update to
// the host computer.
del_weak_mods(MOD_BIT(KC_LSFT));
send_keyboard_report();
}
caps_word_active = active;
caps_word_set_user(active);
}
}
bool caps_word_get(void) { return caps_word_active; }
__attribute__((weak)) void caps_word_set_user(bool active) {}
__attribute__((weak)) bool caps_word_press_user(uint16_t keycode) {
switch (keycode) {
// Keycodes that continue Caps Word, with shift applied.
case KC_A ... KC_Z:
add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key.
return true;
// Keycodes that continue Caps Word, without shifting.
case KC_1 ... KC_0:
case KC_BSPC:
case KC_MINS:
case KC_UNDS:
return true;
default:
return false; // Deactivate Caps Word.
}
}

View file

@ -1,127 +0,0 @@
// 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.
//
//
// Caps Word, activated by pressing both shift keys at the same time.
//
// This library implements "Caps Word", which is like conventional Caps Lock,
// but automatically disables itself at the end of the word. This is useful for
// typing all-caps identifiers like `MOD_MASK_ALT`.
//
// Caps Word is activated by pressing the left and right shift keys at the same
// time. This way you don't need a dedicated key for using Caps Word. I've
// tested that this works as expected with one-shot mods and Space Cadet Shift.
// If your shift keys are mod-taps, activate Caps Word by holding both shift
// mod-tap keys until the tapping term, release them, then begin typing.
//
// Optionally, Caps Word may be configured to deactivate if the keyboard is idle
// for some time. This is useful to mitigate unintended shifting when you get
// interrupted or switch to the mouse while Caps Word is active. In your
// config.h, define `CAPS_WORD_IDLE_TIMEOUT` with a time in milliseconds:
//
// #define CAPS_WORD_IDLE_TIMEOUT 5000 // Turn off Caps Word after 5 seconds.
//
// and in your keymap.c, define (or add to) `matrix_scan_user()` as
//
// void matrix_scan_user(void) {
// caps_word_task();
// // Other tasks...
// }
//
// For full documentation, see
// https://getreuer.info/posts/keyboards/caps-word
#pragma once
#include QMK_KEYBOARD_H
// Call this function from `process_record_user()` to implement Caps Word.
bool process_caps_word(uint16_t keycode, keyrecord_t* record);
// If CAPS_WORD_IDLE_TIMEOUT is set, call `caps_word_task()` from
// `matrix_scan_user()` as described above.
//
// If CAPS_WORD_IDLE_TIMEOUT isn't set, calling this function has no effect (but
// will still compile).
#if CAPS_WORD_IDLE_TIMEOUT > 0
void caps_word_task(void);
#else
static inline void caps_word_task(void) {}
#endif
// Activates or deactivates Caps Word. For instance activate Caps Word with a
// combo by defining a `COMBO_ACTION` that calls `caps_word_set(true)`:
//
// void process_combo_event(uint16_t combo_index, bool pressed) {
// switch(combo_index) {
// case CAPS_COMBO:
// if (pressed) {
// caps_word_set(true); // Activate Caps Word.
// }
// break;
//
// // Other combos...
// }
// }
void caps_word_set(bool active);
// Returns whether Caps Word is currently active.
bool caps_word_get(void);
// An optional callback that gets called when Caps Word turns on or off. This is
// useful to represent the current Caps Word state, e.g. by setting an LED or
// playing a sound. In your keymap, define
//
// void caps_word_set_user(bool active) {
// if (active) {
// // Do something when Caps Word activates.
// } else {
// // Do something when Caps Word deactivates.
// }
// }
void caps_word_set_user(bool active);
// An optional callback which is called on every key press while Caps Word is
// active. When the key should be shifted (that is, a letter key), the callback
// should call `add_weak_mods(MOD_BIT(KC_LSFT))` to shift the key. The callback
// also determines whether the key should continue Caps Word. Returning true
// continues the current "word", while returning false is "word breaking" and
// deactivates Caps Word. The default callback is
//
// bool caps_word_press_user(uint16_t keycode) {
// switch (keycode) {
// // Keycodes that continue Caps Word, with shift applied.
// case KC_A ... KC_Z:
// add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to the next key.
// return true;
//
// // Keycodes that continue Caps Word, without shifting.
// case KC_1 ... KC_0:
// case KC_BSPC:
// case KC_MINS:
// case KC_UNDS:
// return true;
//
// default:
// return false; // Deactivate Caps Word.
// }
// }
//
// To customize, copy the above function into your keymap and add/remove
// keycodes to the above cases.
//
// NOTE: Outside of this callback, you can use `caps_word_set(false)` to
// deactivate Caps Word.
bool caps_word_press_user(uint16_t keycode);

View file

@ -1,5 +1,5 @@
/* Copyright 2021 Jonavin Eng @Jonavin /* Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <jcblake@outlook.com> Copyright 2022 gourdo1 <gourdo1@outlook.com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -17,10 +17,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#define TAPPING_TOGGLE 2 // Force n-key rollover
// TT set to two taps #define FORCE_NKRO
/* Handle GRAVESC combo keys */ // Set TT to two taps
#define TAPPING_TOGGLE 2
#ifdef COMMAND_ENABLE
#define IS_COMMAND() (get_mods() == MOD_MASK_CTRL) //debug commands accessed by holding down both CTRLs: https://github.com/qmk/qmk_firmware/blob/master/docs/feature_command.md
#endif
// Caps Word configuration
#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD
#define CAPS_WORD_IDLE_TIMEOUT 10000 // Automatically turn off after x milliseconds of idle. 0 to never timeout.
// Handle GRAVESC combo keys
#define GRAVE_ESC_ALT_OVERRIDE #define GRAVE_ESC_ALT_OVERRIDE
// Always send Escape if Alt is pressed // Always send Escape if Alt is pressed
#define GRAVE_ESC_CTRL_OVERRIDE #define GRAVE_ESC_CTRL_OVERRIDE
@ -31,19 +42,79 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define TAPPING_TERM_PER_KEY #define TAPPING_TERM_PER_KEY
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR #define RGB_DISABLE_WHEN_USB_SUSPENDED
#define RGB_DISABLE_WHEN_USB_SUSPENDED #define RGB_MATRIX_KEYPRESSES // Enables REACTIVE & SPLASH modes
#endif #define RGB_MATRIX_FRAMEBUFFER_EFFECTS // Enables Heatmap, Rain
// RGB step values // RGB step values
#define RGBLIGHT_HUE_STEP 32 // The number of steps to cycle through the hue by (default 10) #define RGBLIGHT_HUE_STEP 32 // The number of steps to cycle through the hue by (default 10)
#define RGBLIGHT_SAT_STEP 17 // The number of steps to increment the saturation by (default 17) #define RGBLIGHT_SAT_STEP 17 // The number of steps to increment the saturation by (default 17)
#define RGBLIGHT_VAL_STEP 17 // The number of steps to increment the brightness by (default 17) #define RGBLIGHT_VAL_STEP 17 // The number of steps to increment the brightness by (default 17)
// add fifth layer for colemak -- set "COLEMAK_LAYER_ENABLE = yes" in rules.mk to enable // Startup values, when none have been set
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_REACTIVE // Sets the default effect mode, if none has been set (was RGB_MATRIX_SOLID_COLOR)
#define RGB_MATRIX_STARTUP_HUE 24 // Sets the default hue value, if none has been set
#define RGB_MATRIX_STARTUP_SAT 255 // Sets the default saturation value, if none has been set
#define RGB_MATRIX_STARTUP_VAL 127 // Sets the default brightness value, if none has been set
#define RGB_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, if none has been set
// Uncomment any #undef line below to turn OFF any default enabled RGB background effect (enabled in keyboards/gmmk/pro/config.h).
#undef ENABLE_RGB_MATRIX_ALPHAS_MODS // Solid color (seems redundant; seems same as RGB_MATRIX_SOLID_COLOR?)
//#undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN // Static, horizontal rainbow
//#undef ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT // Static, vertical Rainbow
//#undef ENABLE_RGB_MATRIX_BREATHING // Breathing animation using selected HSV color
#undef ENABLE_RGB_MATRIX_BAND_SAT // Single hue band fading saturation scrolling left to right (with white)
//#undef ENABLE_RGB_MATRIX_BAND_VAL // Single hue band fading brightness scrolling left to right (with black)
#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT // Single hue 3 blade spinning pinwheel fades sat (with white)
//#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL // Single hue 3 blade spinning pinwheel fades brightness (with black)
#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT // Single hue spinning spiral fades brightness (with white)
//#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL // Single hue spinning spiral fades brightness (with black)
//#undef ENABLE_RGB_MATRIX_CYCLE_ALL // Full keyboard cycling through rainbow
//#undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT // Full gradient moving left to right
//#undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN // Full gradient scrolling top to bottom
#undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON // Full gradient chevron scrolling left to right (too similar to cycle left right)
//#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN // Rainbow circles coming to center.
#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL // Two Rainbow circles coming to 1/3 and 2/3 points. (seems mostly redundant with above)
#undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL // Built-in cycling pinwheel (seems redundant with below)
//#undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL // Full gradient spinning spiral around center of keyboard
#undef ENABLE_RGB_MATRIX_RAINBOW_BEACON // Spinning rainbow (more distracting transitions)
//#undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS // Spinning rainbow (smoother)
#undef ENABLE_RGB_MATRIX_DUAL_BEACON // Two rainbows spinning around keyboard (distracting, busy)
#undef ENABLE_RGB_MATRIX_RAINDROPS // Sustained raindrops of blue, green, yellow (confusing to use with RGB layers)
//#undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // Sustained raindrops of blue, purple, pink, green (confusing to use with RGB layers, but slightly better than above)
#undef ENABLE_RGB_MATRIX_HUE_BREATHING // Hue shifts up a slight amount at the same time, then shifts back (very subtle)
#undef ENABLE_RGB_MATRIX_HUE_PENDULUM // Hue shifts up a slight amount in a wave to the right, then back to the left (very subtle)
#undef ENABLE_RGB_MATRIX_HUE_WAVE // Hue shifts up a slight amount and then back down in a wave to the right (very subtle)
//#undef ENABLE_RGB_MATRIX_PIXEL_RAIN // Non-sustained raindrops of pastel colors
#undef ENABLE_RGB_MATRIX_PIXEL_FLOW // More active version of pixel rain with quick cycling (unusable, very distracting)
#undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL // Same as Pixel Flow but with current HSV only (somewhat distracting)
//Only enabled if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
//#undef ENABLE_RGB_MATRIX_TYPING_HEATMAP // Fading heatmap that follows keystrokes (has buggy side LEDs that glow red)
//#undef ENABLE_RGB_MATRIX_DIGITAL_RAIN // The Matrix (has buggy side LEDs that glow red)
//Only enabled if RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE // Key hits shown in current hue - all other keys black
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE // Keyboard lights up in chosen hue, key hits shown in complementary hue (try this as default?)
#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE // Hue & value pulse around a single key hit then fades value out (Single key)
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE // same as above but more intense (Multi-key)
#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS // Column and Row single current color fade (Single key)
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS // Column and Row single color fade. (Multi-key)
#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS // Hue & value pulse away on the same column and row of key hit then fades (Single key)
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS // Hue & value pulse away on the same column and row of multi-key hit then fades
//#undef ENABLE_RGB_MATRIX_SPLASH // Full rainbow pulses from key hit. All else black.
#undef ENABLE_RGB_MATRIX_MULTISPLASH // Full rainbow pulses from multi-keys. All else black. (distracting on multiple keystroke hits)
#undef ENABLE_RGB_MATRIX_SOLID_SPLASH // Single color pulses from key hit. All else black. (distracting on multiple key hits)
//#undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH // Single color pulses from muli-keys. All else black.
#endif //RGB_MATRIX_ENABLE
// Add a layer for colemak -- set "COLEMAK_LAYER_ENABLE = yes" in rules.mk to enable
#if defined COLEMAK_LAYER_ENABLE #if defined COLEMAK_LAYER_ENABLE
#define DYNAMIC_KEYMAP_LAYER_COUNT 5 #ifdef GAME_ENABLE
#define _COLEMAK 4 #define DYNAMIC_KEYMAP_LAYER_COUNT 6
#define _COLEMAK 5
#else
#define DYNAMIC_KEYMAP_LAYER_COUNT 5
#define _COLEMAK 4
#endif //GAME_ENABLE
#endif // COLEMAK_LAYER_ENABLE #endif // COLEMAK_LAYER_ENABLE
/* /*

View file

@ -1,7 +1,7 @@
/* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com> /* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>
Copyright 2021 Jonavin Eng @Jonavin Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <jcblake@outlook.com> Copyright 2022 gourdo1 <gourdo1@outlook.com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in users/gourdo1/gourdo1.c // Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
@ -24,6 +24,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "gourdo1.h" #include "gourdo1.h"
#include "paddlegame.h"
#include <math.h>
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base Layout /* Base Layout
@ -44,39 +48,60 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
[_BASE] = LAYOUT( [_BASE] = LAYOUT(
KC_ESCLYR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_HOME, KC_MUTE, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LEFTOFENC, ENCFUNC,
KC_GRV, 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_DEL, KC_GRV, 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, BELOWENC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
TT(_NUMPADMOUSE), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, CAPSNUM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
KC_LSFTCAPSWIN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, LSFTCAPSWIN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
), ),
/* FN1 Layout /* FN1 Layout
* *
* ,-------------------------------------------------------------------------------------------------------------. * ,-------------------------------------------------------------------------------------------------------------.
* | Esc ||MyCmp |WbHom | Calc |MdSel ||MdPrv |MdNxt |MdPly |MdStp ||VolDn |VolUp |PrScr |ScrLk ||Pause || ____ | * | Esc ||MyCmp |WbHom | Calc |MdSel ||MdPrv |MdNxt |MdPly |MdStp ||VolDn |VolUp |PrScr |ScrLk ||Pause ||Sleep |
* |=============================================================================================================| * |=============================================================================================================|
* | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |RGBTOD|RGBTOI| ________ ||RGBTOG| * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |RGBTOD|RGBTOI| ________ ||RGBTOG|
* |------+------+------+------+------+------+------+------+------+------+------+------+------+----------++------| * |------+------+------+------+------+------+------+------+------+------+------+------+------+----------++------|
* | ______ |RGBSAD|RGBVAI|RGBSAI| NKRO | ____ |YAHOO | ____ | ____ |OUTLK |Pause | ____ | ____ | Reset || Home | * | ______ |RGBSAD|RGBVAI|RGBSAI| NKRO | ____ |YAHOO | ____ | ____ |OUTLK |Pause | ____ | ____ |QK_BOOT|| Home |
* |---------+------+------+------+------+------+------+------+------+------+------+------+------+-------++------| * |---------+------+------+------+------+------+------+------+------+------+------+------+------+-------++------|
* | Capslock |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | __________ || End | * | Capslock |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | __________ || End |
* |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------| * |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
* | __________ |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| ____ | ______ ||RGBMOD|| ____ | * | __________ |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD | ______ ||RGBMOD|| ____ |
* |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======| * |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
* | ____ | WinKyLk | ____ | _____ | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI| * | ____ | WinKyLk | ____ | _____ | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI|
* `------------------------------------------------------------------------------------------------------------' * `------------------------------------------------------------------------------------------------------------'
*/ */
#ifdef GAME_ENABLE
[_FN1] = LAYOUT( [_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, _______, EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG, PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, KC_PAUS, SWAP_L, SWAP_R, RESET, KC_HOME, _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R, QK_BOOT, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, _______, _______, _______, _______, KC_END, KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, KC_END,
_______, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______, _______, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
),
[_GAME] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
#else
[_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, KC_PAUS, SWAP_L, SWAP_R, QK_BOOT, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, KC_END,
_______, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI _______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
), ),
#endif //GAME_ENABLE
/* _NUMPADMOUSE Layout /* _NUMPADMOUSE Layout
* Note: A symbol preceded by "P" is a Numpad-encoded version of the key -- any app that differentiates will recognize the char as coming from a physical numpad. * Note: A symbol preceded by "P" is a Numpad-encoded version of the key -- any app that differentiates will recognize the char as coming from a physical numpad.
@ -101,7 +126,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, KC_WH_U, _______, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, KC_WH_U,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, _______, KC_PENT, KC_WH_D, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, _______, KC_PENT, KC_WH_D,
_______, KC_NO, _______, _______, _______, KC_NO, KC_NO, KC_P0, KC_00, KC_PDOT, KC_PSLS, KC_BTN1, KC_MS_U, KC_BTN2, _______, KC_NO, _______, _______, _______, KC_NO, KC_NO, KC_P0, KC_00, KC_PDOT, KC_PSLS, KC_BTN1, KC_MS_U, KC_BTN2,
_______, _______, _______, _______, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R _______, _______, _______, KC_PENT, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R
), ),
[_MOUSEKEY] = LAYOUT( [_MOUSEKEY] = LAYOUT(
@ -115,19 +140,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#ifdef COLEMAK_LAYER_ENABLE #ifdef COLEMAK_LAYER_ENABLE
[_COLEMAK] = LAYOUT( [_COLEMAK] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_MUTE, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
KC_GRV, 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_HOME, KC_GRV, 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_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
_______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_PGDN, _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_PGDN,
_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
_______, _______, _______, KC_SPC, KC_RALT, _______,KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT _______, _______, _______, KC_SPC, KC_RALT, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
), ),
#endif // COLEMAK_LAYER_ENABLE #endif // COLEMAK_LAYER_ENABLE
}; };
#if defined(ENCODER_ENABLE) && !defined(ENCODER_DEFAULTACTIONS_ENABLE) // Encoder Functionality when not using userspace defaults #if defined(ENCODER_ENABLE) && !defined(ENCODER_DEFAULTACTIONS_ENABLE) // Encoder Functionality when not using userspace defaults
void encoder_action_rgbhue(bool clockwise) { void encoder_action_rgbhue(bool clockwise) {
if (clockwise) if (clockwise)
rgblight_increase_hue_noeeprom(); rgblight_increase_hue_noeeprom();
else else
rgblight_decrease_hue_noeeprom(); rgblight_decrease_hue_noeeprom();
@ -154,6 +179,18 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
timeout_update_threshold(clockwise); timeout_update_threshold(clockwise);
#endif #endif
break; break;
#ifdef GAME_ENABLE
case _GAME:
// Game: Paddle movement
if (damage_count == 0) {
if (clockwise) {
if (paddle_pos_full < 15) ++paddle_pos_full;
} else {
if (paddle_pos_full > 0) --paddle_pos_full;
}
}
break;
#endif //GAME_ENABLE
default: default:
encoder_action_volume(clockwise); // Otherwise it just changes volume encoder_action_volume(clockwise); // Otherwise it just changes volume
break; break;
@ -165,6 +202,45 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
#endif // ENCODER_ENABLE && !ENCODER_DEFAULTACTIONS_ENABLE #endif // ENCODER_ENABLE && !ENCODER_DEFAULTACTIONS_ENABLE
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
// Game logic
#ifdef GAME_ENABLE
void init_ball(uint8_t i) {
i &= 1;
ball[i].on = true;
ball[i].up = false;
ball[i].y = 0;
ball[i].x = rand() % 16;
// Set initial ball state
if (ball[i].x < 8) {
ball[i].left = false;
} else {
ball[i].x -= 4;
ball[i].left = true;
}
// 1/4 chance of being an enemy ball after level 6
if (level_number > 3) {
ball[i].enemy = ((rand() % 4) == 0);
} else {
ball[i].enemy = false;
}
}
void hurt_paddle(void) {
if (paddle_lives > 0) {
--paddle_lives;
}
damage_timer = timer_read();
damage_count = 10;
// Reset board
init_ball(0);
ball[1].on = false;
}
#endif //GAME_ENABLE
// Capslock, Scroll lock and Numlock indicator on Left side lights. // Capslock, Scroll lock and Numlock indicator on Left side lights.
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
if (get_rgb_nightmode()) rgb_matrix_set_color_all(RGB_OFF); if (get_rgb_nightmode()) rgb_matrix_set_color_all(RGB_OFF);
@ -174,6 +250,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_L3, RGB_RED); rgb_matrix_set_color(LED_L3, RGB_RED);
rgb_matrix_set_color(LED_L4, RGB_RED); rgb_matrix_set_color(LED_L4, RGB_RED);
rgb_matrix_set_color(LED_TAB, RGB_RED); rgb_matrix_set_color(LED_TAB, RGB_RED);
rgb_matrix_set_color(LED_F12, RGB_RED);
} }
// System NumLock warning indicator RGB setup // System NumLock warning indicator RGB setup
@ -197,12 +274,19 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
// CapsLock RGB setup // CapsLock RGB setup
if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) { if (user_config.rgb_hilite_caps) {
rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE); for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) {
rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE);
}
rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LSFT, RGB_CHARTREUSE);
}
else {
rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LSFT, RGB_CHARTREUSE);
} }
rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LSFT, RGB_CHARTREUSE);
} }
// Winkey disabled (gaming) mode RGB setup // Winkey disabled (gaming) mode RGB setup
@ -239,9 +323,9 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_LALT, RGB_RED); rgb_matrix_set_color(LED_LALT, RGB_RED);
rgb_matrix_set_color(LED_SPC, RGB_RED); rgb_matrix_set_color(LED_SPC, RGB_RED);
rgb_matrix_set_color(LED_LWIN, RGB_RED); rgb_matrix_set_color(LED_LWIN, RGB_RED);
rgb_matrix_set_color(LED_RALT, RGB_RED); //rgb_matrix_set_color(LED_RALT, RGB_RED);
rgb_matrix_set_color(LED_FN, RGB_OFFBLUE); rgb_matrix_set_color(LED_FN, RGB_OFFBLUE);
rgb_matrix_set_color(LED_RCTL, RGB_RED); //rgb_matrix_set_color(LED_RCTL, RGB_RED);
rgb_matrix_set_color(LED_BSLS, RGB_RED); rgb_matrix_set_color(LED_BSLS, RGB_RED);
rgb_matrix_set_color(LED_L1, RGB_RED); rgb_matrix_set_color(LED_L1, RGB_RED);
rgb_matrix_set_color(LED_L2, RGB_RED); rgb_matrix_set_color(LED_L2, RGB_RED);
@ -264,37 +348,90 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_R8, RGB_RED); rgb_matrix_set_color(LED_R8, RGB_RED);
rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE); rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);
rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE); rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE);
#ifdef GAME_ENABLE
rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);
#else
rgb_matrix_set_color(LED_P, RGB_RED);
#endif // GAME_ENABLE
//Add RGB statuses for user.config toggles
if (user_config.rgb_hilite_caps) {
rgb_matrix_set_color(LED_1, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_1, RGB_PURPLE);
}
if (user_config.rgb_hilite_numpad) {
rgb_matrix_set_color(LED_2, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_2, RGB_PURPLE);
}
if (user_config.esc_double_tap_to_baselyr) {
rgb_matrix_set_color(LED_3, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_3, RGB_PURPLE);
}
if (user_config.del_right_home_top) {
rgb_matrix_set_color(LED_4, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_4, RGB_PURPLE);
}
if (user_config.double_tap_shift_for_capslock) {
rgb_matrix_set_color(LED_5, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_5, RGB_PURPLE);
}
if (user_config.encoder_press_mute_or_media) {
rgb_matrix_set_color(LED_6, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_6, RGB_PURPLE);
}
if (user_config.ins_on_shft_bkspc_or_del) {
rgb_matrix_set_color(LED_7, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_7, RGB_PURPLE);
}
if (user_config.disable_space_mods) {
rgb_matrix_set_color(LED_8, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_8, RGB_PURPLE);
}
// Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code // Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code
uint16_t timeout_threshold = get_timeout_threshold(); uint16_t timeout_threshold = get_timeout_threshold();
if (timeout_threshold <= 10) rgb_matrix_set_color(LED_LIST_FUNCROW[timeout_threshold], RGB_CYAN); if (timeout_threshold <= 10) rgb_matrix_set_color(LED_LIST_FUNCROW[timeout_threshold], RGB_BLUE);
else if (timeout_threshold < 140) { else if (timeout_threshold < 140) {
rgb_matrix_set_color(LED_LIST_FUNCROW[(timeout_threshold / 10)], RGB_CYAN); rgb_matrix_set_color(LED_LIST_FUNCROW[(timeout_threshold / 10)], RGB_CYAN);
rgb_matrix_set_color(LED_LIST_NUMROW[(timeout_threshold % 10)], RGB_CYAN); rgb_matrix_set_color(LED_LIST_FUNCROW[(timeout_threshold % 10)], RGB_BLUE);
} else { // >= 140 minutes, just show these 3 lights } else { // >= 140 minutes, just show these 3 lights
rgb_matrix_set_color(LED_LIST_NUMROW[10], RGB_CYAN); rgb_matrix_set_color(LED_LIST_FUNCROW[10], RGB_CYAN);
rgb_matrix_set_color(LED_LIST_NUMROW[11], RGB_CYAN); rgb_matrix_set_color(LED_LIST_FUNCROW[11], RGB_CYAN);
rgb_matrix_set_color(LED_LIST_NUMROW[12], RGB_CYAN); rgb_matrix_set_color(LED_LIST_FUNCROW[12], RGB_CYAN);
} }
break; break;
// Numpad & Mouse Keys overlay RGB // Numpad & Mouse Keys overlay RGB
case _NUMPADMOUSE: case _NUMPADMOUSE:
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) { if (user_config.rgb_hilite_numpad) {
rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE); for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {
rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE);
}
rgb_matrix_set_color(LED_L5, RGB_OFFBLUE);
rgb_matrix_set_color(LED_L6, RGB_OFFBLUE);
rgb_matrix_set_color(LED_CAPS, RGB_OFFBLUE);
rgb_matrix_set_color(LED_UP, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_DOWN, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LEFT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RIGHT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RCTL, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RSFT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_END, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_PGUP, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_PGDN, RGB_CHARTREUSE);
} else {
rgb_matrix_set_color(LED_L5, RGB_OFFBLUE);
rgb_matrix_set_color(LED_L6, RGB_OFFBLUE);
rgb_matrix_set_color(LED_CAPS, RGB_OFFBLUE);
} }
rgb_matrix_set_color(LED_L5, RGB_OFFBLUE);
rgb_matrix_set_color(LED_L6, RGB_OFFBLUE);
rgb_matrix_set_color(LED_CAPS, RGB_OFFBLUE);
rgb_matrix_set_color(LED_UP, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_DOWN, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LEFT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RIGHT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RCTL, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RSFT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_END, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_PGUP, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_PGDN, RGB_CHARTREUSE);
break; break;
// MOUSEKEYS mode RGB // MOUSEKEYS mode RGB
@ -308,19 +445,229 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
rgb_matrix_set_color(LED_END, RGB_CYAN); rgb_matrix_set_color(LED_END, RGB_CYAN);
rgb_matrix_set_color(LED_PGUP, RGB_OFFBLUE); rgb_matrix_set_color(LED_PGUP, RGB_OFFBLUE);
rgb_matrix_set_color(LED_PGDN, RGB_OFFBLUE); rgb_matrix_set_color(LED_PGDN, RGB_OFFBLUE);
break; break;
// Colemak layer RGB // Colemak layer RGB
#ifdef COLEMAK_LAYER_ENABLE #ifdef COLEMAK_LAYER_ENABLE
case _COLEMAK: case _COLEMAK:
for (uint8_t i = 0; i < ARRAYSIZE(LED_SIDE_RIGHT); i++) { for (uint8_t i = 0; i < ARRAYSIZE(LED_SIDE_RIGHT); i++) {
rgb_matrix_set_color(LED_SIDE_RIGHT[i], RGB_MAGENTA); rgb_matrix_set_color(LED_SIDE_RIGHT[i], RGB_MAGENTA);
rgb_matrix_set_color(LED_SIDE_LEFT[i], RGB_MAGENTA); rgb_matrix_set_color(LED_SIDE_LEFT[i], RGB_MAGENTA);
} }
break; break;
#endif #endif
// Paddle game logic
#ifdef GAME_ENABLE
case _GAME:
if (!game_start) {
srand((unsigned int) timer_read());
// Store user light settings
last_hsv = rgb_matrix_get_hsv();
rgb_matrix_sethsv_noeeprom(0, 0, 0);
paddle_pos_full = 8;
paddle_lives = 4;
bounce_count = 0;
level_number = 0;
damage_count = 0;
init_ball(0);
ball[1].on = false;
ball_timer = timer_read();
game_start = true;
}
// Set level indicator
if (level_number < 12) {
rgb_matrix_set_color(GAME_R0[level_number], RGB_BLUE);
}
// Set life bar
for (uint8_t i = 0; i < paddle_lives; i++) {
rgb_matrix_set_color(GAME_LIVES[i], RGB_GREEN);
}
uint8_t paddle_pos = paddle_pos_full >> 1;
if (damage_count > 0) {
// Flash paddle when receiving damage
if (timer_elapsed(damage_timer) > 500) {
--damage_count;
damage_timer = timer_read();
}
if ((damage_count & 1) == 0) {
for (uint8_t i = 0; i < 3; i++) {
rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], RGB_RED);
}
}
if (damage_count == 0) {
ball_timer = timer_read();
}
} else if (paddle_lives == 0) {
// Game over
for (uint8_t i = 0; i < sizeof(LED_GAME_OVER) / sizeof(LED_GAME_OVER[0]); i++) {
rgb_matrix_set_color(LED_GAME_OVER[i], RGB_RED);
}
} else if (level_number >= 12) {
// You win
if (rgb_value.r == 0xff && rgb_value.g < 0xff) {
if (rgb_value.b > 0) {
--rgb_value.b;
} else {
++rgb_value.g;
}
} else if (rgb_value.g == 0xff && rgb_value.b < 0xff) {
if (rgb_value.r > 0) {
--rgb_value.r;
} else {
++rgb_value.b;
}
} else if (rgb_value.b == 0xff && rgb_value.r < 0xff) {
if (rgb_value.g > 0) {
--rgb_value.g;
} else {
++rgb_value.r;
}
}
for (uint8_t i = 0; i < 3; i++) {
rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], rgb_value.r, rgb_value.g, rgb_value.b);
}
rgb_matrix_set_color(GAME_SMILE1[paddle_pos], rgb_value.r, rgb_value.g, rgb_value.b);
rgb_matrix_set_color(GAME_SMILE1[paddle_pos + 3], rgb_value.r, rgb_value.g, rgb_value.b);
rgb_matrix_set_color(GAME_SMILE2[paddle_pos], rgb_value.r, rgb_value.g, rgb_value.b);
rgb_matrix_set_color(GAME_SMILE2[paddle_pos + 3], rgb_value.r, rgb_value.g, rgb_value.b);
} else {
// normal game loop
// Set paddle position
for (uint8_t i = 0; i < 3; i++) {
rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], RGB_GREEN);
}
// Ball movement logic happens at intervals
if (timer_elapsed(ball_timer) > GAME_TIMER[level_number]) {
for (int i = 0; i < 2; ++i) {
if (ball[i].on) {
// Ball movement
if (ball[i].up) {
if (ball[i].y > 0) {
--ball[i].y;
if (!ball[i].left) ++ball[i].x;
} else {
// Count reflections. If > 10, increase level
++bounce_count;
if (bounce_count >= 10) {
bounce_count = 0;
++level_number;
}
ball[i].on = false;
}
} else {
++ball[i].y;
if (ball[i].left) --ball[i].x;
if (ball[i].y > 4) {
// Remove a life if ball isn't returned and isn't enemy
if (!ball[i].enemy) {
hurt_paddle();
i = 2;
} else {
ball[i].on = false;
}
}
}
}
}
if (ball[0].y == 4 && !ball[1].on) {
init_ball(1);
}
if (ball[1].y == 4 && !ball[0].on) {
init_ball(0);
}
if (!ball[0].on && !ball[1].on) {
init_ball(0);
}
ball_timer = timer_read();
}
// Other ball stuff
for (int i = 0; i < 2; ++i) {
if (ball[i].on) {
// Ball deflection logic
if (!ball[i].up && ball[i].y == 4 && (ball[i].x == paddle_pos || ball[i].x == paddle_pos - 1 || ball[i].x == paddle_pos + 1)) {
if (!ball[i].enemy) {
--ball[i].y;
if (!ball[i].left) {
++ball[i].x;
}
ball[i].up = true;
} else {
hurt_paddle();
i = 2;
}
}
// Ball display
switch (ball[i].y) {
case 0:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R0[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R0[ball[i].x], RGB_WHITE);
}
break;
case 1:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R1[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R1[ball[i].x], RGB_WHITE);
}
break;
case 2:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R2[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R2[ball[i].x], RGB_WHITE);
}
break;
case 3:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R3[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R3[ball[i].x], RGB_WHITE);
}
break;
case 4:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R4[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R4[ball[i].x], RGB_WHITE);
}
break;
}
}
}
}
break;
#endif //GAME_ENABLE
default: default:
#ifdef GAME_ENABLE
if (game_start) {
// Reset lighting settings
game_start = false;
rgb_matrix_sethsv_noeeprom(last_hsv.h, last_hsv.s, last_hsv.v);
}
#endif //GAME_ENABLE
break; break;
} }
} }
@ -329,8 +676,6 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
void keyboard_post_init_keymap(void) { void keyboard_post_init_keymap(void) {
// keyboard_post_init_user() moved to userspace // keyboard_post_init_user() moved to userspace
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR);
rgb_matrix_sethsv_noeeprom(20, 255, 127); // Default startup color (Hue:amber Saturation:full Value(brightness):mid)
activate_rgb_nightmode(false); // Set to true if you want to startup in nightmode, otherwise use Fn + Z to toggle activate_rgb_nightmode(false); // Set to true if you want to startup in nightmode, otherwise use Fn + Z to toggle
#endif #endif
} }

View file

@ -0,0 +1,48 @@
/* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>
Copyright 2021 Tomas Guinan
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/>.
*/
#ifdef GAME_ENABLE
const uint16_t GAME_TIMER[] = {
400, 350, 300, 250, 400, 350, 300, 250, 225, 200, 175, 150
};
bool game_start = false;
HSV last_hsv;
static uint8_t paddle_pos_full;
static uint8_t paddle_lives;
static uint8_t level_number;
static uint8_t bounce_count;
static uint8_t damage_count;
static uint16_t damage_timer;
static uint16_t ball_timer;
struct BallStruct
{
uint8_t x;
uint8_t y;
bool on;
bool up;
bool left;
bool enemy;
};
struct BallStruct ball[2];
void init_ball(uint8_t i);
void hurt_paddle(void);
#endif //GAME_ENABLE

View file

@ -1,6 +1,6 @@
# gourdo1's GMMK Pro ANSI layout # [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ANSI layout
This Windows-centric layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/ansi/keymaps/jonavin) GMMK Pro layout with several additions, modifications, a tweaked keymap, updated layers and expanded RGB controls. This Windows-centric ANSI layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) GMMK Pro layout with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB effects and controls.
![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg) ![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg)
@ -8,26 +8,51 @@ This Windows-centric layout is based on [Jonavin's](https://github.com/qmk/qmk_f
### Core Functionality ### Core Functionality
* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde key) to view toggle-able features. (added Jun 29, 2022)
* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022) * [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022)
* Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled * Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled
* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with FN+R * [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R
* Gaming mode (FN + Win-key) locks out Win-key as well as double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming related keys * 1000Hz polling rate with 5ms debounce time for quick response in games
* [Caps Word](https://getreuer.info/posts/keyboards/caps-word/index.html) enabled: To capitalize the next word only, press and release both left and right shift keys at the same time. (added Feb 25, 2022) * Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse
* Multi-monitor app moving shortcuts: FN + [,] (square brackets) to move current app window to next monitor (added Apr 11, 2022) * Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry
* Domain shortcuts: FN+.=".com", FN+O="outlook.com", FN+Y="yahoo.com", FN+H="hotmail.com", FN+G="gmail.com". (added Apr 7, 2022) * Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys
* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time. (added Feb 25, 2022)
* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor (added Apr 11, 2022)
* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted) * Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted)
* Fn-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) * Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit (added May 5, 2022)
* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/ (added May 14, 2022)
* Single-handed shortcut for WinKey-L (lock Windows): [FN]L (added May 17, 2022)
* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com. (added Apr 7, 2022)
* FN-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md)
* Home key on F13, Del key right of Backspace * Home key on F13, Del key right of Backspace
* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer) * Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer)
* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: Fn+F11, Fn+F12, Fn+F13 * PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13
* [Colemak](https://colemak.com/) key layout support (Layer accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple) * [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple)
* Double tap ESC any time to revert to base layer (added Feb 26, 2022) * Double tap ESC any time to revert to base layer (added Feb 26, 2022)
* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022)
* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022)
### Quick & Easy Customization
* Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence.
* Print current settings by opening a text editor and pressing [FN]~ (CAUTION: verbose!)
* Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF)
#### Toggle-able Settings:
1. CapsLock RGB - highlight under alpha keys
2. Numpad RGB - highlight under numpad layer keys
3. ESC key - Double tap ESC key to go to base layer
4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC
5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock
6. Encoder button - default mutes volume; alternate plays/pauses media
7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL
8. Modded-Space override - Use standard Space in place of modded-Space functions
### Numpad + Mouse Keys (Capslock key) ### Numpad + Mouse Keys (Capslock key)
* Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting * Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting
* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022)
* This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use) * This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use)
* Fn & N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output (FN + N to toggle) * FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle)
* Double zero on comma key. * Double zero on comma key.
* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022) * [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022)
* Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel * Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel
@ -37,40 +62,54 @@ This Windows-centric layout is based on [Jonavin's](https://github.com/qmk/qmk_f
* Default knob turn changes volume; button press toggles mute * Default knob turn changes volume; button press toggles mute
* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022) * Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022)
* FN knob turn changes RGB idle timeout * FN + knob turn changes RGB idle timeout
* FN + knob push puts PC to Sleep (Added May 14, 2022)
* holding Left Shift changes layers * holding Left Shift changes layers
* holding Right Shift navigates page up/down * holding Right Shift navigates page up/down
* holding Left Ctrl navigates prev/next word * holding Left Ctrl navigates prev/next word
* holding Right Ctrl changes RGB hue/color * holding Right Ctrl changes RGB hue/color
* holding Left Alt changes media prev/next track * holding Left Alt changes media prev/next track
### Paddle Game
* Based on [Tomas Guinan's excellent GMMK Pro paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame)
* Paddle Game playable by pressing [FN]P (P lights up green in FN layer if game is enabled in firmware, otherwise it lights up red)
* Use rotary encoder to control paddle
* Contains 12 levels, indicated by blue LED on F-key row
* Player has 4 lives, indicated by nav cluster
* Deflect white balls while avoiding red ones
* Use [FN]P, double tap ESC or otherwise change layer to quit game
### Global RGB Controls ### Global RGB Controls
* RGB backlight lighting effect: FN + up/down * RGB backlight lighting effect: [FN]up/down
* RGB backlight effect speed: FN + left/right * RGB backlight effect speed: [FN]left/right
* RGB backlight hue cycle: FN + A/D * RGB backlight hue cycle: [FN]A/D
* RGB backlight brightness: FN + W/S * RGB backlight brightness: [FN]W/S
* RGB backlight saturation: FN + Q/E (added Feb 4, 2022) * RGB backlight saturation: [FN]Q/E (added Feb 4, 2022)
* RGB backlight night mode toggle: FN + Z (indicators still work) * RGB backlight night mode toggle: [FN]Z (indicators still work)
* RGB backlight timeout: FN + Encoder or "-" and "=" (default 15 minutes) (updated Apr 7, 2022) * RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes) (updated June 28, 2022)
* indicators in FN layer using RGB in F-key and number rows to show the current timeout in minutes * F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes
* RGB indicators on left side LEDs: Capslock (green), Scroll Lock (red), and Num Lock not set (orange) * [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle
* FN + Z to turn off RGB backlighting; press again to toggle * Left side RGB indicators in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green).
### Advanced Controls ### Advanced Controls
* FN + \ to get to bootloader mode * [FN]\ to get to bootloader mode
* FN + [ESC] to clear EEPROM (then unplug and re-plug) (added Apr 11, 2022) * [FN][ESC] to clear EEPROM (added Apr 11, 2022)
* FN + R to toggle N-key Rollover (added Apr 11, 2022) * [FN]R to toggle N-key Rollover (added Apr 11, 2022)
* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022)
* [FN]L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022)
* [FN][Encoder press] to sleep Windows PC (added May 14, 2022)
Link to latest firmware binary: https://github.com/gourdo1/media/raw/main/gmmk_pro_ansi_gourdo1.bin Link to latest firmware binary: https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin
Link to cheatsheet: https://github.com/gourdo1/media/raw/main/GMMK_Pro_Cheatsheet.pdf Link to cheatsheet: https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf
## rules.mk Options ## rules.mk Options
STARTUP_NUMLOCK_ON = yes - turns on NUMLOCK by default STARTUP_NUMLOCK_ON = yes - Turns on NUMLOCK by default
ENCODER_DEFAULTACTIONS_ENABLE = yes - Enabled default encoder functions ENCODER_DEFAULTACTIONS_ENABLE = yes - Enabled default encoder functions
@ -78,20 +117,21 @@ TD_LSFT_CAPSLOCK_ENABLE = yes - This will enable double tap on Left Shift
IDLE_TIMEOUT_ENABLE = yes - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically IDLE_TIMEOUT_ENABLE = yes - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically
INVERT_NUMLOCK_INDICATOR - inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with numpad keys, so should generally be off when numpad layer is active. INVERT_NUMLOCK_INDICATOR - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should be off when numpad layer is active unless you have an external numpad.
COLEMAK_LAYER_ENABLE = yes - Enable optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer. COLEMAK_LAYER_ENABLE = yes - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer.
GAME_ENABLE ?= yes - Enables Paddle Game
## Layer Diagrams ## Layer Diagrams
### Base layer ### Base layer
![image](https://raw.githubusercontent.com/gourdo1/media/main/base.png) ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/base.png)
### Fn Layer ### FN Layer
![image](https://raw.githubusercontent.com/gourdo1/media/main/fn1.png) ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/fn1.png)
### Layer 2 (Numpad) ### Layer 2 (Numpad)
![image](https://raw.githubusercontent.com/gourdo1/media/main/numpad.png) ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/numpad.png)
### COLEMAK layer ### COLEMAK layer
![image](https://user-images.githubusercontent.com/71780717/131235050-980d2f54-2d23-4ae8-a83f-9fcdbe60d6cb.png) ![image](https://user-images.githubusercontent.com/71780717/131235050-980d2f54-2d23-4ae8-a83f-9fcdbe60d6cb.png)

View file

@ -1,5 +1,5 @@
/* Copyright 2021 Jonavin Eng @Jonavin /* Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <jcblake@outlook.com> Copyright 2022 gourdo1 <gourdo1@outlook.com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -16,6 +16,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
//Define variables for Game
bool fn_active = false;
RGB rgb_value;
// Custom GMMK Pro-specific RGB color customizations (defaults found in quantum/color.h) // Custom GMMK Pro-specific RGB color customizations (defaults found in quantum/color.h)
#define RGB_GODSPEED 0x00, 0xE4, 0xFF // color for matching keycaps #define RGB_GODSPEED 0x00, 0xE4, 0xFF // color for matching keycaps
#define RGB_NAUTILUS 0x00, 0xA4, 0xA9 // Nautilus Font colors #define RGB_NAUTILUS 0x00, 0xA4, 0xA9 // Nautilus Font colors
@ -194,7 +199,7 @@ const uint8_t LED_LIST_NUMROW[] = {
}; };
const uint8_t LED_LIST_LETTERS[] = { const uint8_t LED_LIST_LETTERS[] = {
LED_1, /* LED_1,
LED_2, LED_2,
LED_3, LED_3,
LED_4, LED_4,
@ -203,7 +208,7 @@ const uint8_t LED_LIST_LETTERS[] = {
LED_7, LED_7,
LED_8, LED_8,
LED_9, LED_9,
LED_0, LED_0, */
LED_Q, LED_Q,
LED_W, LED_W,
LED_E, LED_E,
@ -284,4 +289,122 @@ const uint8_t LED_SIDE_RIGHT[] = {
LED_R8 LED_R8
}; };
#ifdef GAME_ENABLE
// Game LED rules
const uint8_t GAME_LIVES[] = {
LED_DEL,
LED_PGUP,
LED_PGDN,
LED_END
};
const uint8_t GAME_PADDLE[] = {
LED_Z,
LED_X,
LED_C,
LED_V,
LED_B,
LED_N,
LED_M,
LED_COMM,
LED_DOT,
LED_SLSH
};
const uint8_t GAME_SMILE1[] = {
LED_A,
LED_S,
LED_D,
LED_F,
LED_G,
LED_H,
LED_J,
LED_K,
LED_L,
LED_SCLN,
LED_QUOT
};
const uint8_t GAME_SMILE2[] = {
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0,
LED_MINS,
LED_EQL
};
const uint8_t GAME_R4[] = {
LED_X,
LED_C,
LED_V,
LED_B,
LED_N,
LED_M,
LED_COMM,
LED_DOT
};
const uint8_t GAME_R3[] = {
LED_S,
LED_D,
LED_F,
LED_G,
LED_H,
LED_J,
LED_K,
LED_L,
LED_SCLN
};
const uint8_t GAME_R2[] = {
LED_W,
LED_E,
LED_R,
LED_T,
LED_Y,
LED_U,
LED_I,
LED_O,
LED_P,
LED_LBRC
};
const uint8_t GAME_R1[] = {
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0,
LED_MINS,
LED_EQL
};
const uint8_t GAME_R0[] = {
LED_F1,
LED_F2,
LED_F3,
LED_F4,
LED_F5,
LED_F6,
LED_F7,
LED_F8,
LED_F9,
LED_F10,
LED_F11,
LED_F12
};
const uint8_t LED_GAME_OVER[] = {
LED_5,
LED_8,
LED_F,
LED_G,
LED_H,
LED_J,
LED_C,
LED_M
};
#endif //GAME_ENABLE
#endif #endif

View file

@ -1,18 +1,18 @@
SRC += caps_word.c
LTO_ENABLE = yes # link time optimization -- achieves a smaller compiled size LTO_ENABLE = yes # link time optimization -- achieves a smaller compiled size
CONSOLE_ENABLE = no CONSOLE_ENABLE = no
COMMAND_ENABLE = no COMMAND_ENABLE = no
MOUSEKEY_ENABLE = yes
VIA_ENABLE = yes
TAP_DANCE_ENABLE = yes
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
VIA_ENABLE = yes
TD_LSFT_CAPSLOCK_ENABLE = yes MOUSEKEY_ENABLE = yes
TAP_DANCE_ENABLE = yes
CAPS_WORD_ENABLE = yes # Enable built-in Caps Word functionality
IDLE_TIMEOUT_ENABLE = yes IDLE_TIMEOUT_ENABLE = yes
STARTUP_NUMLOCK_ON = yes STARTUP_NUMLOCK_ON = yes
ENCODER_DEFAULTACTIONS_ENABLE = no ENCODER_DEFAULTACTIONS_ENABLE = no
COLEMAK_LAYER_ENABLE = yes # Enable Colemak layer / set to no to disable COLEMAK_LAYER_ENABLE = yes # Enable Colemak layer / set to no to disable
INVERT_NUMLOCK_INDICATOR = yes INVERT_NUMLOCK_INDICATOR = yes
GAME_ENABLE ?= yes # Enable Paddle Game / set to no to disable
ifeq ($(strip $(GAME_ENABLE)), yes)
OPT_DEFS += -DGAME_ENABLE
endif

View file

@ -0,0 +1,146 @@
/* Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <gourdo1@outlook.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/>.
*/
#pragma once
// Force n-key rollover
#define FORCE_NKRO
// Set TT to two taps
#define TAPPING_TOGGLE 2
#ifdef COMMAND_ENABLE
#define IS_COMMAND() (get_mods() == MOD_MASK_CTRL) //debug commands accessed by holding down both CTRLs: https://github.com/qmk/qmk_firmware/blob/master/docs/feature_command.md
#endif
// Caps Word configuration
#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD
#define CAPS_WORD_IDLE_TIMEOUT 10000 // Automatically turn off after x milliseconds of idle. 0 to never timeout.
// Handle GRAVESC combo keys
#define GRAVE_ESC_ALT_OVERRIDE
// Always send Escape if Alt is pressed
#define GRAVE_ESC_CTRL_OVERRIDE
// Always send Escape if Control is pressed
// #define TAPPING_TERM 180
#define TAPPING_TERM 300
#define TAPPING_TERM_PER_KEY
#ifdef RGB_MATRIX_ENABLE
#define RGB_DISABLE_WHEN_USB_SUSPENDED
#define RGB_MATRIX_KEYPRESSES // Enables REACTIVE & SPLASH modes
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS // Enables Heatmap, Rain
// RGB step values
#define RGBLIGHT_HUE_STEP 32 // The number of steps to cycle through the hue by (default 10)
#define RGBLIGHT_SAT_STEP 17 // The number of steps to increment the saturation by (default 17)
#define RGBLIGHT_VAL_STEP 17 // The number of steps to increment the brightness by (default 17)
// Startup values, when none have been set
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_REACTIVE // Sets the default effect mode, if none has been set (was RGB_MATRIX_SOLID_COLOR)
#define RGB_MATRIX_STARTUP_HUE 24 // Sets the default hue value, if none has been set
#define RGB_MATRIX_STARTUP_SAT 255 // Sets the default saturation value, if none has been set
#define RGB_MATRIX_STARTUP_VAL 127 // Sets the default brightness value, if none has been set
#define RGB_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, if none has been set
// Uncomment any #undef line below to turn OFF any default enabled RGB background effect (enabled in keyboards/gmmk/pro/config.h).
#undef ENABLE_RGB_MATRIX_ALPHAS_MODS // Solid color (seems redundant; seems same as RGB_MATRIX_SOLID_COLOR?)
//#undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN // Static, horizontal rainbow
//#undef ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT // Static, vertical Rainbow
//#undef ENABLE_RGB_MATRIX_BREATHING // Breathing animation using selected HSV color
#undef ENABLE_RGB_MATRIX_BAND_SAT // Single hue band fading saturation scrolling left to right (with white)
//#undef ENABLE_RGB_MATRIX_BAND_VAL // Single hue band fading brightness scrolling left to right (with black)
#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT // Single hue 3 blade spinning pinwheel fades sat (with white)
//#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL // Single hue 3 blade spinning pinwheel fades brightness (with black)
#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT // Single hue spinning spiral fades brightness (with white)
//#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL // Single hue spinning spiral fades brightness (with black)
//#undef ENABLE_RGB_MATRIX_CYCLE_ALL // Full keyboard cycling through rainbow
//#undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT // Full gradient moving left to right
//#undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN // Full gradient scrolling top to bottom
#undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON // Full gradient chevron scrolling left to right (too similar to cycle left right)
//#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN // Rainbow circles coming to center.
#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL // Two Rainbow circles coming to 1/3 and 2/3 points. (seems mostly redundant with above)
#undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL // Built-in cycling pinwheel (seems redundant with below)
//#undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL // Full gradient spinning spiral around center of keyboard
#undef ENABLE_RGB_MATRIX_RAINBOW_BEACON // Spinning rainbow (more distracting transitions)
//#undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS // Spinning rainbow (smoother)
#undef ENABLE_RGB_MATRIX_DUAL_BEACON // Two rainbows spinning around keyboard (distracting, busy)
#undef ENABLE_RGB_MATRIX_RAINDROPS // Sustained raindrops of blue, green, yellow (confusing to use with RGB layers)
//#undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // Sustained raindrops of blue, purple, pink, green (confusing to use with RGB layers, but slightly better than above)
#undef ENABLE_RGB_MATRIX_HUE_BREATHING // Hue shifts up a slight amount at the same time, then shifts back (very subtle)
#undef ENABLE_RGB_MATRIX_HUE_PENDULUM // Hue shifts up a slight amount in a wave to the right, then back to the left (very subtle)
#undef ENABLE_RGB_MATRIX_HUE_WAVE // Hue shifts up a slight amount and then back down in a wave to the right (very subtle)
//#undef ENABLE_RGB_MATRIX_PIXEL_RAIN // Non-sustained raindrops of pastel colors
#undef ENABLE_RGB_MATRIX_PIXEL_FLOW // More active version of pixel rain with quick cycling (unusable, very distracting)
#undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL // Same as Pixel Flow but with current HSV only (somewhat distracting)
//Only enabled if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
//#undef ENABLE_RGB_MATRIX_TYPING_HEATMAP // Fading heatmap that follows keystrokes (has buggy side LEDs that glow red)
//#undef ENABLE_RGB_MATRIX_DIGITAL_RAIN // The Matrix (has buggy side LEDs that glow red)
//Only enabled if RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE // Key hits shown in current hue - all other keys black
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE // Keyboard lights up in chosen hue, key hits shown in complementary hue (try this as default?)
#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE // Hue & value pulse around a single key hit then fades value out (Single key)
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE // same as above but more intense (Multi-key)
#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS // Column and Row single current color fade (Single key)
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS // Column and Row single color fade. (Multi-key)
#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS // Hue & value pulse away on the same column and row of key hit then fades (Single key)
//#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS // Hue & value pulse away on the same column and row of multi-key hit then fades
//#undef ENABLE_RGB_MATRIX_SPLASH // Full rainbow pulses from key hit. All else black.
#undef ENABLE_RGB_MATRIX_MULTISPLASH // Full rainbow pulses from multi-keys. All else black. (distracting on multiple keystroke hits)
#undef ENABLE_RGB_MATRIX_SOLID_SPLASH // Single color pulses from key hit. All else black. (distracting on multiple key hits)
//#undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH // Single color pulses from muli-keys. All else black.
#endif //RGB_MATRIX_ENABLE
// Add a layer for colemak -- set "COLEMAK_LAYER_ENABLE = yes" in rules.mk to enable
#if defined COLEMAK_LAYER_ENABLE
#ifdef GAME_ENABLE
#define DYNAMIC_KEYMAP_LAYER_COUNT 6
#define _COLEMAK 5
#else
#define DYNAMIC_KEYMAP_LAYER_COUNT 5
#define _COLEMAK 4
#endif //GAME_ENABLE
#endif // COLEMAK_LAYER_ENABLE
/*
// Mouse Keys Accelerated Mode Definitions
#define MOUSEKEY_DELAY 3 // Delay between pressing a movement key and cursor movement (default: 10)
#define MOUSEKEY_INTERVAL 13 // Time between cursor movements in milliseconds (default: 20); Try setting to 1000/monitor refresh for smooth movement.
#define MOUSEKEY_MOVE_DELTA 8 // Step size (default: 8)
#define MOUSEKEY_MAX_SPEED 9 // Maximum cursor speed at which acceleration stops (default: 10)
#define MOUSEKEY_TIME_TO_MAX 150 // Time until maximum cursor speed is reached (default: 30)
#define MOUSEKEY_WHEEL_DELAY 0 // Delay between pressing a wheel key and wheel movement (default: 10)
#define MOUSEKEY_WHEEL_INTERVAL 80 // Time between wheel movements (default: 80)
#define MOUSEKEY_WHEEL_MAX_SPEED 8 // Maximum number of scroll steps per scroll action (default: 8)
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 // Time until maximum scroll speed is reached (default: 40)
*/
// Mouse Keys Kinetic Mode Definitions
#define MK_KINETIC_SPEED // Enable Kinetic mode: Uses a quadratic curve on cursor speed to allow precise movements at the beginning and increases speed thereafter.
#define MOUSEKEY_DELAY 3 // Delay between pressing a movement key and cursor movement (default: 10)
#define MOUSEKEY_INTERVAL 13 // Time between cursor movements in milliseconds (default: 20); Try setting to 1000/monitor refresh for smooth movement.
#define MOUSEKEY_MOVE_DELTA 5 // Step size for accelerating from initial to base speed (default: 8)
#define MOUSEKEY_MOVE_MAX 50 // use instead of BASE SPEED to limit speed in Kinetic mode
#define MOUSEKEY_INITIAL_SPEED 100 // Initial speed of the cursor in pixels per second (default: 100)
//#define MOUSEKEY_BASE_SPEED 800 // (broken in QMK 0.16.0) Maximum cursor speed at which acceleration stops (default: 1000)
#define MOUSEKEY_DECELERATED_SPEED 400 // Decelerated cursor speed (default: 400)
#define MOUSEKEY_ACCELERATED_SPEED 2000 // Accelerated cursor speed (default: 3000)
#define MOUSEKEY_WHEEL_INITIAL_MOVEMENTS 16 // Initial number of movements of the mouse wheel (default: 16)
#define MOUSEKEY_WHEEL_BASE_MOVEMENTS 32 // Maximum number of movements at which acceleration stops (default: 32)
#define MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS 48 // Accelerated wheel movements (default: 48)
#define MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS 8 // Decelerated wheel movements (default: 8)

View file

@ -0,0 +1,682 @@
/* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>
Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 RustyBrakes (ISO conversion)
Copyright 2022 gourdo1 <gourdo1@outlook.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/>.
*/
// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c
#include QMK_KEYBOARD_H
#include "rgb_matrix_map.h"
#include "gourdo1.h"
#include "paddlegame.h"
#include <math.h>
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base Layout
*
* ,-------------------------------------------------------------------------------------------------------------.
* | Esc || F1 | F2 | F3 | F4 || F5 | F6 | F7 | F8 || F9 | F10 | F11 | F12 || Home || Mute |
* |=============================================================================================================|
* | ISO | 1 ! | 2 @ | 3 # | 4 $ | 5 % | 6 ^ | 7 & | 8 * | 9 ( | 0 ) | - _ | = + | Backspc || Del |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+----------++------|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | [ } | ] } | || PgUp |
* |---------+------+------+------+------+------+------+------+------+------+------+------+------+ ++------|
* | Capslock | A | S | D | F | G | H | J | K | L | ; : | ' " | ISO| Enter || PgDn |
* |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
* | LShift | ISO | Z | X | C | V | B | N | M | , < | . > | / ? | RShift || Up || End |
* |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
* | Ctrl | Win | LAlt | Space | RAlt | Fn | Ctrl || Left | Down | Rght |
* `------------------------------------------------------------------------------------------------------------'
*/
[_BASE] = LAYOUT(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, LEFTOFENC, ENCFUNC,
KC_GRV, 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, BELOWENC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP,
CAPSNUM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
LSFTCAPSWIN,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
/* FN1 Layout
*
* ,-------------------------------------------------------------------------------------------------------------.
* | Esc ||MyCmp |WbHom | Calc |MdSel ||MdPrv |MdNxt |MdPly |MdStp ||VolDn |VolUp |PrScr |ScrLk ||Pause ||Sleep |
* |=============================================================================================================|
* | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |RGBTOD|RGBTOI| ________ ||RGBTOG|
* |------+------+------+------+------+------+------+------+------+------+------+------+------+----------++------|
* | ______ |RGBSAD|RGBVAI|RGBSAI| NKRO | ____ |YAHOO | ____ | ____ |OUTLK |Pause | ____ | ____ | || Home |
* |---------+------+------+------+------+------+------+------+------+------+------+------+------+ ++------|
* | Capslock |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | ___ | ____ || End |
* |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
* | ____ |RESET |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD | ______ ||RGBMOD|| ____ |
* |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
* | ____ | WinKyLk | ____ | _____ | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI|
* `------------------------------------------------------------------------------------------------------------'
*/
#ifdef GAME_ENABLE
[_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, _______, KC_END,
_______, RESET, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, WINLOCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
),
[_GAME] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
#else
[_FN1] = LAYOUT(
EE_CLR, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS, KC_SLEP,
PRNCONF, TG_CAPS, TG_PAD, TG_ESC, TG_DEL, TG_TDCAP,TG_ENC, TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______, RGB_TOG,
_______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO, _______, _______, OUTLOOK, KC_PAUS, SWAP_L, SWAP_R, KC_HOME,
KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL, HOTMAIL, _______, _______, LOCKPC, _______, _______, _______, _______, KC_END,
_______, RESET, RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM, KC_CAD, _______, RGB_MOD, _______,
_______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
),
#endif //GAME_ENABLE
/* _NUMPADMOUSE Layout
* Note: A symbol preceded by "P" is a Numpad-encoded version of the key -- any app that differentiates will recognize the char as coming from a physical numpad.
* ,-------------------------------------------------------------------------------------------------------------.
* | ____ || ____ | ____ | ____ | ____ || ____ | ____ | ____ | ____ || ____ | ____ | ____ | ____ || ____ || ____ |
* |=============================================================================================================|
* | ____ | P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 | P0 | P- | P+ | ________ || ____ |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+----------++------|
* | ______ | PGUP | Up | PGDN | None | None | None | P4 | P5 | P6 | P+ | ____ | ____ | || WhUp |
* |---------+------+------+------+------+------+------+------+------+------+------+------+------+ ++------|
* | ________ | Left | Down | Rght | None| None | None | P1 | P2 | P3 | P* | ___ | ___ |P-Enter|| WhDn |
* |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
* | __________ | None | ____ | ____ | ____ | None | None | 0 | 00 | P. | P/ | MBt1 ||MS_UP || MBt2 |
* |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
* | ____ | ____ | ____ | _____ | ____ | ____ | MBt3 ||MS_LT |MS_DN |MS_RT |
* `------------------------------------------------------------------------------------------------------------'
*/
[_NUMPADMOUSE] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, _______, _______,
_______, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, KC_WH_U,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PAST, _______, _______, KC_PENT, KC_WH_D,
_______, _______, KC_NO, _______, _______, _______, KC_NO, KC_NO, KC_P0, KC_00, KC_PDOT, KC_PSLS, KC_BTN1, KC_MS_U, KC_BTN2,
_______, _______, _______, KC_PENT, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R
),
[_MOUSEKEY] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_U,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_D,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2,
_______, _______, _______, _______, _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R
),
#ifdef COLEMAK_LAYER_ENABLE
[_COLEMAK] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
KC_GRV, 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_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_PGUP,
_______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
_______, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
_______, _______, _______, KC_SPC, KC_RALT, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
#endif // COLEMAK_LAYER_ENABLE
};
#if defined(ENCODER_ENABLE) && !defined(ENCODER_DEFAULTACTIONS_ENABLE) // Encoder Functionality when not using userspace defaults
void encoder_action_rgbhue(bool clockwise) {
if (clockwise)
rgblight_increase_hue_noeeprom();
else
rgblight_decrease_hue_noeeprom();
}
bool encoder_update_user(uint8_t index, bool clockwise) {
uint8_t mods_state = get_mods();
if (mods_state & MOD_BIT(KC_LSFT)) { // If you are holding L shift, encoder changes layers
encoder_action_layerchange(clockwise);
} else if (mods_state & MOD_BIT(KC_RSFT)) { // If you are holding R shift, Page up/dn
unregister_mods(MOD_BIT(KC_RSFT));
encoder_action_navpage(clockwise);
register_mods(MOD_BIT(KC_RSFT));
} else if (mods_state & MOD_BIT(KC_LCTL)) { // if holding Left Ctrl, navigate next/prev word
encoder_action_navword(clockwise);
} else if (mods_state & MOD_BIT(KC_RCTL)) { // if holding Right Ctrl, change rgb hue/colour
encoder_action_rgbhue(clockwise);
} else if (mods_state & MOD_BIT(KC_LALT)) { // if holding Left Alt, change media next/prev track
encoder_action_mediatrack(clockwise);
} else {
switch (get_highest_layer(layer_state)) {
case _FN1:
#ifdef IDLE_TIMEOUT_ENABLE
timeout_update_threshold(clockwise);
#endif
break;
#ifdef GAME_ENABLE
case _GAME:
// Game: Paddle movement
if (damage_count == 0) {
if (clockwise) {
if (paddle_pos_full < 15) ++paddle_pos_full;
} else {
if (paddle_pos_full > 0) --paddle_pos_full;
}
}
break;
#endif //GAME_ENABLE
default:
encoder_action_volume(clockwise); // Otherwise it just changes volume
break;
}
}
//return true; //set to return false to counteract enabled encoder in pro.c
return false;
}
#endif // ENCODER_ENABLE && !ENCODER_DEFAULTACTIONS_ENABLE
#ifdef RGB_MATRIX_ENABLE
// Game logic
#ifdef GAME_ENABLE
void init_ball(uint8_t i) {
i &= 1;
ball[i].on = true;
ball[i].up = false;
ball[i].y = 0;
ball[i].x = rand() % 16;
// Set initial ball state
if (ball[i].x < 8) {
ball[i].left = false;
} else {
ball[i].x -= 4;
ball[i].left = true;
}
// 1/4 chance of being an enemy ball after level 6
if (level_number > 3) {
ball[i].enemy = ((rand() % 4) == 0);
} else {
ball[i].enemy = false;
}
}
void hurt_paddle(void) {
if (paddle_lives > 0) {
--paddle_lives;
}
damage_timer = timer_read();
damage_count = 10;
// Reset board
init_ball(0);
ball[1].on = false;
}
#endif //GAME_ENABLE
// Capslock, Scroll lock and Numlock indicator on Left side lights.
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
if (get_rgb_nightmode()) rgb_matrix_set_color_all(RGB_OFF);
// Scroll Lock RGB setup
if (IS_HOST_LED_ON(USB_LED_SCROLL_LOCK)) {
rgb_matrix_set_color(LED_L3, RGB_RED);
rgb_matrix_set_color(LED_L4, RGB_RED);
rgb_matrix_set_color(LED_TAB, RGB_RED);
rgb_matrix_set_color(LED_F12, RGB_RED);
}
// System NumLock warning indicator RGB setup
#ifdef INVERT_NUMLOCK_INDICATOR
if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
rgb_matrix_set_color(LED_GRV, RGB_ORANGE2);
rgb_matrix_set_color(LED_L1, RGB_ORANGE2);
rgb_matrix_set_color(LED_L2, RGB_ORANGE2);
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
rgb_matrix_set_color(LED_FN, RGB_ORANGE2);
}
#else
if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
rgb_matrix_set_color(LED_GRV, RGB_ORANGE2);
rgb_matrix_set_color(LED_L1, RGB_ORANGE2);
rgb_matrix_set_color(LED_L2, RGB_ORANGE2);
rgb_matrix_set_color(LED_N, RGB_ORANGE2);
rgb_matrix_set_color(LED_FN, RGB_ORANGE2);
}
#endif // INVERT_NUMLOCK_INDICATOR
// CapsLock RGB setup
if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
if (user_config.rgb_hilite_caps) {
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) {
rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE);
}
rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LSFT, RGB_CHARTREUSE);
}
else {
rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LSFT, RGB_CHARTREUSE);
}
}
// Winkey disabled (gaming) mode RGB setup
if (keymap_config.no_gui) {
rgb_matrix_set_color(LED_LWIN, RGB_RED); //light up Winkey red when disabled
rgb_matrix_set_color(LED_W, RGB_CHARTREUSE); //light up gaming keys with WSAD higlighted
rgb_matrix_set_color(LED_S, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_A, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_D, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_Q, RGB_ORANGE2);
rgb_matrix_set_color(LED_E, RGB_ORANGE2);
rgb_matrix_set_color(LED_R, RGB_ORANGE2);
rgb_matrix_set_color(LED_TAB, RGB_ORANGE2);
rgb_matrix_set_color(LED_F, RGB_ORANGE2);
rgb_matrix_set_color(LED_Z, RGB_ORANGE2);
rgb_matrix_set_color(LED_X, RGB_ORANGE2);
rgb_matrix_set_color(LED_C, RGB_ORANGE2);
rgb_matrix_set_color(LED_V, RGB_ORANGE2);
rgb_matrix_set_color(LED_SPC, RGB_ORANGE2);
rgb_matrix_set_color(LED_LCTL, RGB_ORANGE2);
rgb_matrix_set_color(LED_LSFT, RGB_ORANGE2);
}
// Fn selector mode RGB setup
switch (get_highest_layer(layer_state)) { // special handling per layer
case _FN1: // on Fn layer select what the encoder does when pressed
rgb_matrix_set_color(LED_FN, RGB_RED); //FN key
//NEW RGB LIGHTING TO RING KEYBOARD ON FN LAYER ACTIVATION:
for (uint8_t j = 0; j < ARRAYSIZE(LED_LIST_FUNCROW); j++) {
rgb_matrix_set_color(LED_LIST_FUNCROW[j], RGB_RED);
}
rgb_matrix_set_color(LED_LCTL, RGB_RED);
rgb_matrix_set_color(LED_LALT, RGB_RED);
rgb_matrix_set_color(LED_SPC, RGB_RED);
rgb_matrix_set_color(LED_LWIN, RGB_RED);
//rgb_matrix_set_color(LED_RALT, RGB_RED);
rgb_matrix_set_color(LED_FN, RGB_OFFBLUE);
//rgb_matrix_set_color(LED_RCTL, RGB_RED);
rgb_matrix_set_color(LED_BSLS, RGB_RED);
rgb_matrix_set_color(LED_L1, RGB_RED);
rgb_matrix_set_color(LED_L2, RGB_RED);
rgb_matrix_set_color(LED_L3, RGB_RED);
rgb_matrix_set_color(LED_L4, RGB_RED);
rgb_matrix_set_color(LED_L5, RGB_RED);
rgb_matrix_set_color(LED_L6, RGB_RED);
rgb_matrix_set_color(LED_L7, RGB_RED);
rgb_matrix_set_color(LED_L8, RGB_RED);
rgb_matrix_set_color(LED_DOWN, RGB_RED);
rgb_matrix_set_color(LED_LEFT, RGB_RED);
rgb_matrix_set_color(LED_RIGHT, RGB_RED);
rgb_matrix_set_color(LED_R1, RGB_RED);
rgb_matrix_set_color(LED_R2, RGB_RED);
rgb_matrix_set_color(LED_R3, RGB_RED);
rgb_matrix_set_color(LED_R4, RGB_RED);
rgb_matrix_set_color(LED_R5, RGB_RED);
rgb_matrix_set_color(LED_R6, RGB_RED);
rgb_matrix_set_color(LED_R7, RGB_RED);
rgb_matrix_set_color(LED_R8, RGB_RED);
rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);
rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE);
#ifdef GAME_ENABLE
rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);
#else
rgb_matrix_set_color(LED_P, RGB_RED);
#endif // GAME_ENABLE
//Add RGB statuses for user.config toggles
if (user_config.rgb_hilite_caps) {
rgb_matrix_set_color(LED_1, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_1, RGB_PURPLE);
}
if (user_config.rgb_hilite_numpad) {
rgb_matrix_set_color(LED_2, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_2, RGB_PURPLE);
}
if (user_config.esc_double_tap_to_baselyr) {
rgb_matrix_set_color(LED_3, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_3, RGB_PURPLE);
}
if (user_config.del_right_home_top) {
rgb_matrix_set_color(LED_4, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_4, RGB_PURPLE);
}
if (user_config.double_tap_shift_for_capslock) {
rgb_matrix_set_color(LED_5, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_5, RGB_PURPLE);
}
if (user_config.encoder_press_mute_or_media) {
rgb_matrix_set_color(LED_6, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_6, RGB_PURPLE);
}
if (user_config.ins_on_shft_bkspc_or_del) {
rgb_matrix_set_color(LED_7, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_7, RGB_PURPLE);
}
if (user_config.disable_space_mods) {
rgb_matrix_set_color(LED_8, RGB_GREEN);
} else {
rgb_matrix_set_color(LED_8, RGB_PURPLE);
}
// Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code
uint16_t timeout_threshold = get_timeout_threshold();
if (timeout_threshold <= 10) rgb_matrix_set_color(LED_LIST_FUNCROW[timeout_threshold], RGB_BLUE);
else if (timeout_threshold < 140) {
rgb_matrix_set_color(LED_LIST_FUNCROW[(timeout_threshold / 10)], RGB_CYAN);
rgb_matrix_set_color(LED_LIST_FUNCROW[(timeout_threshold % 10)], RGB_BLUE);
} else { // >= 140 minutes, just show these 3 lights
rgb_matrix_set_color(LED_LIST_FUNCROW[10], RGB_CYAN);
rgb_matrix_set_color(LED_LIST_FUNCROW[11], RGB_CYAN);
rgb_matrix_set_color(LED_LIST_FUNCROW[12], RGB_CYAN);
}
break;
// Numpad & Mouse Keys overlay RGB
case _NUMPADMOUSE:
if (user_config.rgb_hilite_numpad) {
for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {
rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE);
}
rgb_matrix_set_color(LED_L5, RGB_OFFBLUE);
rgb_matrix_set_color(LED_L6, RGB_OFFBLUE);
rgb_matrix_set_color(LED_CAPS, RGB_OFFBLUE);
rgb_matrix_set_color(LED_UP, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_DOWN, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LEFT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RIGHT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RCTL, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RSFT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_END, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_PGUP, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_PGDN, RGB_CHARTREUSE);
} else {
rgb_matrix_set_color(LED_L5, RGB_OFFBLUE);
rgb_matrix_set_color(LED_L6, RGB_OFFBLUE);
rgb_matrix_set_color(LED_CAPS, RGB_OFFBLUE);
}
break;
// MOUSEKEYS mode RGB
case _MOUSEKEY:
rgb_matrix_set_color(LED_UP, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_DOWN, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_LEFT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RIGHT, RGB_CHARTREUSE);
rgb_matrix_set_color(LED_RCTL, RGB_CYAN);
rgb_matrix_set_color(LED_RSFT, RGB_CYAN);
rgb_matrix_set_color(LED_END, RGB_CYAN);
rgb_matrix_set_color(LED_PGUP, RGB_OFFBLUE);
rgb_matrix_set_color(LED_PGDN, RGB_OFFBLUE);
break;
// Colemak layer RGB
#ifdef COLEMAK_LAYER_ENABLE
case _COLEMAK:
for (uint8_t i = 0; i < ARRAYSIZE(LED_SIDE_RIGHT); i++) {
rgb_matrix_set_color(LED_SIDE_RIGHT[i], RGB_MAGENTA);
rgb_matrix_set_color(LED_SIDE_LEFT[i], RGB_MAGENTA);
}
break;
#endif
// Paddle game logic
#ifdef GAME_ENABLE
case _GAME:
if (!game_start) {
srand((unsigned int) timer_read());
// Store user light settings
last_hsv = rgb_matrix_get_hsv();
rgb_matrix_sethsv_noeeprom(0, 0, 0);
paddle_pos_full = 8;
paddle_lives = 4;
bounce_count = 0;
level_number = 0;
damage_count = 0;
init_ball(0);
ball[1].on = false;
ball_timer = timer_read();
game_start = true;
}
// Set level indicator
if (level_number < 12) {
rgb_matrix_set_color(GAME_R0[level_number], RGB_BLUE);
}
// Set life bar
for (uint8_t i = 0; i < paddle_lives; i++) {
rgb_matrix_set_color(GAME_LIVES[i], RGB_GREEN);
}
uint8_t paddle_pos = paddle_pos_full >> 1;
if (damage_count > 0) {
// Flash paddle when receiving damage
if (timer_elapsed(damage_timer) > 500) {
--damage_count;
damage_timer = timer_read();
}
if ((damage_count & 1) == 0) {
for (uint8_t i = 0; i < 3; i++) {
rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], RGB_RED);
}
}
if (damage_count == 0) {
ball_timer = timer_read();
}
} else if (paddle_lives == 0) {
// Game over
for (uint8_t i = 0; i < sizeof(LED_GAME_OVER) / sizeof(LED_GAME_OVER[0]); i++) {
rgb_matrix_set_color(LED_GAME_OVER[i], RGB_RED);
}
} else if (level_number >= 12) {
// You win
if (rgb_value.r == 0xff && rgb_value.g < 0xff) {
if (rgb_value.b > 0) {
--rgb_value.b;
} else {
++rgb_value.g;
}
} else if (rgb_value.g == 0xff && rgb_value.b < 0xff) {
if (rgb_value.r > 0) {
--rgb_value.r;
} else {
++rgb_value.b;
}
} else if (rgb_value.b == 0xff && rgb_value.r < 0xff) {
if (rgb_value.g > 0) {
--rgb_value.g;
} else {
++rgb_value.r;
}
}
for (uint8_t i = 0; i < 3; i++) {
rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], rgb_value.r, rgb_value.g, rgb_value.b);
}
rgb_matrix_set_color(GAME_SMILE1[paddle_pos], rgb_value.r, rgb_value.g, rgb_value.b);
rgb_matrix_set_color(GAME_SMILE1[paddle_pos + 3], rgb_value.r, rgb_value.g, rgb_value.b);
rgb_matrix_set_color(GAME_SMILE2[paddle_pos], rgb_value.r, rgb_value.g, rgb_value.b);
rgb_matrix_set_color(GAME_SMILE2[paddle_pos + 3], rgb_value.r, rgb_value.g, rgb_value.b);
} else {
// normal game loop
// Set paddle position
for (uint8_t i = 0; i < 3; i++) {
rgb_matrix_set_color(GAME_PADDLE[paddle_pos + i], RGB_GREEN);
}
// Ball movement logic happens at intervals
if (timer_elapsed(ball_timer) > GAME_TIMER[level_number]) {
for (int i = 0; i < 2; ++i) {
if (ball[i].on) {
// Ball movement
if (ball[i].up) {
if (ball[i].y > 0) {
--ball[i].y;
if (!ball[i].left) ++ball[i].x;
} else {
// Count reflections. If > 10, increase level
++bounce_count;
if (bounce_count >= 10) {
bounce_count = 0;
++level_number;
}
ball[i].on = false;
}
} else {
++ball[i].y;
if (ball[i].left) --ball[i].x;
if (ball[i].y > 4) {
// Remove a life if ball isn't returned and isn't enemy
if (!ball[i].enemy) {
hurt_paddle();
i = 2;
} else {
ball[i].on = false;
}
}
}
}
}
if (ball[0].y == 4 && !ball[1].on) {
init_ball(1);
}
if (ball[1].y == 4 && !ball[0].on) {
init_ball(0);
}
if (!ball[0].on && !ball[1].on) {
init_ball(0);
}
ball_timer = timer_read();
}
// Other ball stuff
for (int i = 0; i < 2; ++i) {
if (ball[i].on) {
// Ball deflection logic
if (!ball[i].up && ball[i].y == 4 && (ball[i].x == paddle_pos || ball[i].x == paddle_pos - 1 || ball[i].x == paddle_pos + 1)) {
if (!ball[i].enemy) {
--ball[i].y;
if (!ball[i].left) {
++ball[i].x;
}
ball[i].up = true;
} else {
hurt_paddle();
i = 2;
}
}
// Ball display
switch (ball[i].y) {
case 0:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R0[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R0[ball[i].x], RGB_WHITE);
}
break;
case 1:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R1[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R1[ball[i].x], RGB_WHITE);
}
break;
case 2:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R2[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R2[ball[i].x], RGB_WHITE);
}
break;
case 3:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R3[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R3[ball[i].x], RGB_WHITE);
}
break;
case 4:
if (ball[i].enemy) {
rgb_matrix_set_color(GAME_R4[ball[i].x], RGB_RED);
} else {
rgb_matrix_set_color(GAME_R4[ball[i].x], RGB_WHITE);
}
break;
}
}
}
}
break;
#endif //GAME_ENABLE
default:
#ifdef GAME_ENABLE
if (game_start) {
// Reset lighting settings
game_start = false;
rgb_matrix_sethsv_noeeprom(last_hsv.h, last_hsv.s, last_hsv.v);
}
#endif //GAME_ENABLE
break;
}
}
#endif
void keyboard_post_init_keymap(void) {
// keyboard_post_init_user() moved to userspace
#ifdef RGB_MATRIX_ENABLE
activate_rgb_nightmode(false); // Set to true if you want to startup in nightmode, otherwise use Fn + Z to toggle
#endif
}

View file

@ -0,0 +1,48 @@
/* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>
Copyright 2021 Tomas Guinan
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/>.
*/
#ifdef GAME_ENABLE
const uint16_t GAME_TIMER[] = {
400, 350, 300, 250, 400, 350, 300, 250, 225, 200, 175, 150
};
bool game_start = false;
HSV last_hsv;
static uint8_t paddle_pos_full;
static uint8_t paddle_lives;
static uint8_t level_number;
static uint8_t bounce_count;
static uint8_t damage_count;
static uint16_t damage_timer;
static uint16_t ball_timer;
struct BallStruct
{
uint8_t x;
uint8_t y;
bool on;
bool up;
bool left;
bool enemy;
};
struct BallStruct ball[2];
void init_ball(uint8_t i);
void hurt_paddle(void);
#endif //GAME_ENABLE

View file

@ -0,0 +1,122 @@
# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ISO layout
This Windows-centric ISO layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/iso/keymaps/jonavin) GMMK Pro layout with several additions, fixes, a tweaked keymap, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls.
![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg)
## Features:
### Core Functionality
* ISO layout (added July xx, 2022)
* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022)
* Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled
* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with Fn+R
* 1000Hz polling rate with 5ms debounce time for quick response in games
* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you on the road? Use cursor keys to move the mouse.
* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry
* Gaming mode (Fn+Win-key) locks out Win-key as well as double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming related keys
* [Caps Word](https://getreuer.info/posts/keyboards/caps-word/index.html) enabled: To capitalize the next word only, press and release both left and right shift keys at the same time. (added Feb 25, 2022)
* Multi-monitor app moving shortcuts: Fn+[,] (square brackets) to move current app window to next monitor (added Apr 11, 2022)
* Capslock toggled by double tap of Left Shift key or Fn + Capslock (RGB green highlighted)
* Paddle game accessible via Fn+P; Hit Fn+P again or double tap ESC to exit (added May 5, 2022)
* Single-handed shortcut for Ctrl-Alt-Delete: Fn+/ (added May 14, 2022)
* Single-handed shortcut for Win-L (lock Windows): Fn+L (added May 17, 2022)
* Domain shortcuts: Fn+.=".com", Fn+O="outlook.com", Fn+Y="yahoo.com", Fn+H="hotmail.com", Fn+G="gmail.com". (added Apr 7, 2022)
* Fn-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md)
* Home key on F13, Del key right of Backspace
* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer)
* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: Fn+F11, Fn+F12, Fn+F13
* [Colemak](https://colemak.com/) key layout support (Layer accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple)
* Double tap ESC any time to revert to base layer (added Feb 26, 2022)
* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022)
* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022)
### Numpad + Mouse Keys (Capslock key)
* Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting
* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022)
* This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use)
* Fn and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output (Fn+N to toggle)
* Double zero on comma key.
* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022)
* Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel
* Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green
### Encoder Functionality
* Default knob turn changes volume; button press toggles mute
* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022)
* Fn + knob turn changes RGB idle timeout
* Fn + knob push puts PC to Sleep (Added May 14, 2022)
* holding Left Shift changes layers
* holding Right Shift navigates page up/down
* holding Left Ctrl navigates prev/next word
* holding Right Ctrl changes RGB hue/color
* holding Left Alt changes media prev/next track
### Paddle Game
* Based on [Tomas Guinan's excellent GMMK Pro paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame)
* Paddle Game playable by pressing Fn+P (P lights up green in Fn layer if game is enabled in firmware, otherwise it lights up red)
* Use rotary encoder to control paddle
* Contains 12 levels, indicated by blue LED on F-key row
* Player has 4 lives, indicated by nav cluster
* Deflect white balls while avoiding red ones
* Use Fn+P, double tap ESC or otherwise change layer to quit game
### Global RGB Controls
* RGB backlight lighting effect: Fn+up/down
* RGB backlight effect speed: Fn+left/right
* RGB backlight hue cycle: Fn+A/D
* RGB backlight brightness: Fn+W/S
* RGB backlight saturation: Fn+Q/E (added Feb 4, 2022)
* RGB backlight night mode toggle: Fn+Z (indicators still work)
* RGB backlight timeout: Fn+Encoder or "-" and "=" (default 15 minutes) (updated Apr 7, 2022)
* indicators in Fn layer using RGB in F-key and number rows to show the current timeout in minutes
* Fn+Z to turn off RGB backlighting (indicator lights still work); press again to toggle
* RGB indicators on left side LEDs in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green).
### Advanced Controls
* Fn+\ to get to bootloader mode
* Fn+[ESC] to clear EEPROM (then unplug and re-plug) (added Apr 11, 2022)
* Fn+R to toggle N-key Rollover (added Apr 11, 2022)
* Fn+/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022)
* Fn+L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022)
* Fn+[Encoder press] to sleep Windows PC (added May 14, 2022)
Link to latest firmware binary: https://github.com/gourdo1/media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin
Link to cheatsheet: https://github.com/gourdo1/media/raw/main/GMMK_Pro_Cheatsheet.pdf
## rules.mk Options
STARTUP_NUMLOCK_ON = yes - Turns on NUMLOCK by default
ENCODER_DEFAULTACTIONS_ENABLE = yes - Enabled default encoder functions
TD_LSFT_CAPSLOCK_ENABLE = yes - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS
IDLE_TIMEOUT_ENABLE = yes - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically
INVERT_NUMLOCK_INDICATOR - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should be off when numpad layer is active unless you have an external numpad.
COLEMAK_LAYER_ENABLE = yes - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer.
GAME_ENABLE ?= yes - Enables Paddle Game
## Layer Diagrams
### Base layer
![image](https://raw.githubusercontent.com/gourdo1/media/main/base.png)
### Fn Layer
![image](https://raw.githubusercontent.com/gourdo1/media/main/fn1.png)
### Layer 2 (Numpad)
![image](https://raw.githubusercontent.com/gourdo1/media/main/numpad.png)
### COLEMAK layer
![image](https://user-images.githubusercontent.com/71780717/131235050-980d2f54-2d23-4ae8-a83f-9fcdbe60d6cb.png)

View file

@ -0,0 +1,411 @@
/* Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <gourdo1@outlook.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/>.
*/
#ifdef RGB_MATRIX_ENABLE
//Define variables for Game
bool fn_active = false;
RGB rgb_value;
// Custom GMMK Pro-specific RGB color customizations (defaults found in quantum/color.h)
#define RGB_GODSPEED 0x00, 0xE4, 0xFF // color for matching keycaps
#define RGB_NAUTILUS 0x00, 0xA4, 0xA9 // Nautilus Font colors
#define RGB_OFFBLUE 0x00, 0x80, 0xFF // new color: blue with a hint of green
#define RGB_DKRED 0x28, 0x00, 0x00 // new color: dark red
#define RGB_ORANGE2 0xFF, 0x28, 0x00 // fix: reduced green from 80 to 28
#define RGB_PURPLE2 0x80, 0x00, 0xFF // fix: increased red from 7A to 80
#define RGB_SPRINGGREEN2 0x00, 0xFF, 0x10 // fix: blue was 80, now 10
#define RGB_YELLOW2 0xFF, 0xB0, 0x00 // fix: green was FF, now B0
#define RGB_OFF RGB_BLACK
// Added by gourdo1 for RGB testing
// Red Green Blue Expected GMMK Pro result
#define RGB_TEST1 0xFF, 0x00, 0x00 // Q - red good!
#define RGB_TEST2 0x0F, 0xFF, 0x00 // W - green good!
#define RGB_TEST3 0x00, 0x00, 0xFF // E - blue good!
#define RGB_TEST4 0xFF, 0xB0, 0x00 // R - yellow slightly green heavy - reduced green LED by quite a bit
#define RGB_TEST5 0x00, 0xFF, 0xFF // T - cyan good!
#define RGB_TEST6 0xFF, 0x00, 0xFF // Y - magenta very slightly blue heavy?
#define RGB_TEST7 0xFF, 0x28, 0x00 // U - orange very green heavy at default
#define RGB_TEST8 0xFF, 0x00, 0x80 // I - pink good!
#define RGB_TEST9 0x80, 0xFF, 0x00 // O - chartreus good!
#define RGB_TEST10 0x00, 0xFF, 0x10 // P - springgrn fixed: was too blue because green LED has blue in it already
#define RGB_TEST11 0x00, 0x80, 0xFF // A - grn blue good!
#define RGB_TEST12 0x80, 0x00, 0xFF // S - purple good!
// RGB LED locations
enum led_location_map {
LED_ESC, // 0, ESC, k13
LED_GRV, // 1, `, k16
LED_TAB, // 2, Tab, k11
LED_CAPS, // 3, Caps, k21
LED_LSFT, // 4, Sh_L, k00
LED_LCTL, // 5, Ct_L, k06
LED_F1, // 6, F1, k26
LED_1, // 7, 1, k17
LED_Q, // 8, Q, k10
LED_A, // 9, A, k12
LED_Z, // 10, Z, k14
LED_LWIN, // 11, Win_L, k90
LED_F2, // 12, F2, k36
LED_2, // 13, 2, k27
LED_W, // 14, W, k20
LED_S, // 15, S, k22
LED_X, // 16, X, k24
LED_LALT, // 17, Alt_L, k93
LED_F3, // 18, F3, k31
LED_3, // 19, 3, k37
LED_E, // 20, E, k30
LED_D, // 21, D, k32
LED_C, // 22, C, k34
LED_F4, // 23, F4, k33
LED_4, // 24, 4, k47
LED_R, // 25, R, k40
LED_F, // 26, F, k42
LED_V, // 27, V, k44
LED_F5, // 28, F5, k07
LED_5, // 29, 5, k46
LED_T, // 30, T, k41
LED_G, // 31, G, k43
LED_B, // 32, B, k45
LED_SPC, // 33, SPACE, k94
LED_F6, // 34, F6, k63
LED_6, // 35, 6, k56
LED_Y, // 36, Y, k51
LED_H, // 37, H, k53
LED_N, // 38, N, k55
LED_F7, // 39, F7, k71
LED_7, // 40, 7, k57
LED_U, // 41, U, k50
LED_J, // 42, J, k52
LED_M, // 43, M, k54
LED_F8, // 44, F8, k76
LED_8, // 45, 8, k67
LED_I, // 46, I, k60
LED_K, // 47, K, k62
LED_COMM, // 48, ,, k64
LED_RALT, // 49, Alt_R, k95
LED_F9, // 50, F9, ka6
LED_9, // 51, 9, k77
LED_O, // 52, O, k70
LED_L, // 53, L, k72
LED_DOT, // 54, ., k74
LED_FN, // 55, FN, k92
LED_F10, // 56, F10, ka7
LED_0, // 57, 0, k87
LED_P, // 58, P, k80
LED_SCLN, // 59, ;, k82
LED_SLSH, // 60, ?, k85
LED_F11, // 61, F11, ka3
LED_MINS, // 62, -, k86
LED_LBRC, // 63, [, k81
LED_QUOT, // 64, ", k83
LED_RCTL, // 65, Ct_R, k04
LED_F12, // 66, F12, ka5
LED_BSLS, // 67, \, k23
LED_L1, // 68, LED, l01
LED_R1, // 69, LED, l11
LED_PRT, // 70, Prt, k97
LED_L2, // 71, LED, l02
LED_R2, // 72, LED, l12
LED_DEL, // 73, Del, k65
LED_L3, // 74, LED, l03
LED_R3, // 75, LED, l13
LED_PGUP, // 76, PgUp, k15
LED_L4, // 77, LED, l04
LED_R4, // 78, LED, l14
LED_EQL, // 79, =, k66
LED_RIGHT, // 80, Right, k05
LED_L5, // 81, LED, l05
LED_R5, // 82, LED, l15
LED_END, // 83, End, k75
LED_L6, // 84, LED, l06
LED_R6, // 85, LED, l16
LED_BSPC, // 86, BSpc, ka1
LED_PGDN, // 87, PgDn, k25
LED_L7, // 88, LED, l07
LED_R7, // 89, LED, l17
LED_RBRC, // 90, ], k61
LED_RSFT, // 91, Sh_R, k91
LED_L8, // 92, LED, l08
LED_R8, // 93, LED, l18
LED_UP, // 94, Up, k35
LED_HASH, // 95, #, k84
LED_LEFT, // 96, Left, k03
LED_ENT, // 97, Enter, ka4
LED_DOWN // 98, Down, k73
};
const uint8_t LED_LIST_WASD[] = {
LED_W,
LED_A,
LED_S,
LED_D
};
const uint8_t LED_LIST_ARROWS[] = {
LED_LEFT,
LED_RIGHT,
LED_UP,
LED_DOWN
};
const uint8_t LED_LIST_FUNCROW[] = {
LED_ESC,
LED_F1,
LED_F2,
LED_F3,
LED_F4,
LED_F5,
LED_F6,
LED_F7,
LED_F8,
LED_F9,
LED_F10,
LED_F11,
LED_F12,
LED_PRT
};
const uint8_t LED_LIST_NUMROW[] = {
LED_GRV,
LED_1,
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0,
LED_MINS,
LED_EQL,
LED_BSPC,
LED_DEL
};
const uint8_t LED_LIST_LETTERS[] = {
/* LED_1,
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0, */
LED_Q,
LED_W,
LED_E,
LED_R,
LED_T,
LED_Y,
LED_U,
LED_I,
LED_O,
LED_P,
LED_A,
LED_S,
LED_D,
LED_F,
LED_G,
LED_H,
LED_J,
LED_K,
LED_L,
LED_Z,
LED_X,
LED_C,
LED_V,
LED_B,
LED_N,
LED_M
};
const uint8_t LED_LIST_NUMPAD[] = {
LED_1,
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0,
LED_MINS,
LED_EQL,
LED_U,
LED_I,
LED_O,
LED_P,
LED_J,
LED_K,
LED_L,
LED_SCLN,
LED_ENT,
LED_M,
LED_COMM,
LED_DOT,
LED_SLSH,
LED_END,
LED_RIGHT
};
const uint8_t LED_SIDE_LEFT[] = {
LED_L1,
LED_L2,
LED_L3,
LED_L4,
LED_L5,
LED_L6,
LED_L7,
LED_L8
};
const uint8_t LED_SIDE_RIGHT[] = {
LED_R1,
LED_R2,
LED_R3,
LED_R4,
LED_R5,
LED_R6,
LED_R7,
LED_R8
};
#ifdef GAME_ENABLE
// Game LED rules
const uint8_t GAME_LIVES[] = {
LED_DEL,
LED_PGUP,
LED_PGDN,
LED_END
};
const uint8_t GAME_PADDLE[] = {
LED_Z,
LED_X,
LED_C,
LED_V,
LED_B,
LED_N,
LED_M,
LED_COMM,
LED_DOT,
LED_SLSH
};
const uint8_t GAME_SMILE1[] = {
LED_A,
LED_S,
LED_D,
LED_F,
LED_G,
LED_H,
LED_J,
LED_K,
LED_L,
LED_SCLN,
LED_QUOT
};
const uint8_t GAME_SMILE2[] = {
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0,
LED_MINS,
LED_EQL
};
const uint8_t GAME_R4[] = {
LED_X,
LED_C,
LED_V,
LED_B,
LED_N,
LED_M,
LED_COMM,
LED_DOT
};
const uint8_t GAME_R3[] = {
LED_S,
LED_D,
LED_F,
LED_G,
LED_H,
LED_J,
LED_K,
LED_L,
LED_SCLN
};
const uint8_t GAME_R2[] = {
LED_W,
LED_E,
LED_R,
LED_T,
LED_Y,
LED_U,
LED_I,
LED_O,
LED_P,
LED_LBRC
};
const uint8_t GAME_R1[] = {
LED_2,
LED_3,
LED_4,
LED_5,
LED_6,
LED_7,
LED_8,
LED_9,
LED_0,
LED_MINS,
LED_EQL
};
const uint8_t GAME_R0[] = {
LED_F1,
LED_F2,
LED_F3,
LED_F4,
LED_F5,
LED_F6,
LED_F7,
LED_F8,
LED_F9,
LED_F10,
LED_F11,
LED_F12
};
const uint8_t LED_GAME_OVER[] = {
LED_5,
LED_8,
LED_F,
LED_G,
LED_H,
LED_J,
LED_C,
LED_M
};
#endif //GAME_ENABLE
#endif

View file

@ -0,0 +1,22 @@
LTO_ENABLE = yes # link time optimization -- achieves a smaller compiled size
CONSOLE_ENABLE = no
COMMAND_ENABLE = no
MOUSEKEY_ENABLE = yes
VIA_ENABLE = yes
TAP_DANCE_ENABLE = yes
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
CAPS_WORD_ENABLE = yes # Enable built-in Caps Word functionality
TD_LSFT_CAPSLOCK_ENABLE = yes
IDLE_TIMEOUT_ENABLE = yes
STARTUP_NUMLOCK_ON = yes
ENCODER_DEFAULTACTIONS_ENABLE = no
COLEMAK_LAYER_ENABLE = yes # Enable Colemak layer / set to no to disable
INVERT_NUMLOCK_INDICATOR = yes
GAME_ENABLE ?= yes # Enable Paddle Game / set to no to disable
ifeq ($(strip $(GAME_ENABLE)), yes)
OPT_DEFS += -DGAME_ENABLE
endif

View file

@ -0,0 +1,73 @@
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include "gourdo1.h"
static bool process_capsnum(uint16_t keycode, keyrecord_t * record) {
static bool toggled = false;
static bool tapped = false;
static uint16_t tap_timer = 0;
if (keycode == CAPSNUM) {
if (user_config.double_tap_shift_for_capslock) {
// Act as TT(_NUMPADMOUSE)
if (record -> event.pressed) { // CAPSNUM key was pressed
// Check whether the key was recently tapped
if (tapped && !timer_expired(record -> event.time, tap_timer)) {
// This is a double tap (or possibly a triple tap or more)
// Toggle the layer on.
toggled = true;
} else if (toggled) {
// Otherwise if currently toggled, turn it off
toggled = false;
tapped = false;
layer_off(_NUMPADMOUSE);
}
// Set that the first tap occurred in a potential double tap
tapped = true;
tap_timer = record -> event.time + TAPPING_TERM;
layer_on(_NUMPADMOUSE);
} else if (!toggled) {
// If not currently toggled, turn off on key release
layer_off(_NUMPADMOUSE);
return false;
}
} else { // When double_tap_shift_for_capslock == false
// Act as KC_CAPS
if (record -> event.pressed) {
register_code(KC_CAPS);
} else {
unregister_code(KC_CAPS);
}
}
return false;
} else {
// On an event with any other key, reset the double tap state
tapped = false;
}
return true;
}
static bool process_esc_to_base(uint16_t keycode, keyrecord_t * record) {
static bool tapped = false;
static uint16_t tap_timer = 0;
if (keycode == KC_ESC) {
if (user_config.esc_double_tap_to_baselyr) {
if (record -> event.pressed) {
if (tapped && !timer_expired(record -> event.time, tap_timer)) {
// The key was double tapped.
layer_clear();
}
tapped = true;
tap_timer = record -> event.time + TAPPING_TERM;
}
}
} else {
// On an event with any other key, reset the double tap state.
tapped = false;
}
return true;
}

View file

@ -1,6 +1,6 @@
/* Copyright 2021 Jonavin Eng @Jonavin /* Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <jcblake@outlook.com> Copyright 2022 gourdo1 <gourdo1@outlook.com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or the Free Software Foundation, either version 2 of the License, or
@ -19,35 +19,35 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "gourdo1.h" #include "gourdo1.h"
#include "caps_word.h" #include "custom_double_taps.h"
#ifdef TD_LSFT_CAPSLOCK_ENABLE // Tap once for shift, twice for Caps Lock but only if Win Key is not disabled (also disabled by user.config variable)
// Tap once for shift, twice for Caps Lock but only if Win Key in not disabled
void dance_LSFT_each_tap(qk_tap_dance_state_t * state, void * user_data) { void dance_LSFT_each_tap(qk_tap_dance_state_t * state, void * user_data) {
if (state -> count == 1 || keymap_config.no_gui) { if (user_config.double_tap_shift_for_capslock) {
register_code16(KC_LSFT); if (state -> count == 1 || keymap_config.no_gui) {
register_code(KC_LSFT);
} else {
register_code(KC_CAPS);
}
} else { } else {
register_code(KC_CAPS); register_code(KC_LSFT);
} }
} }
void dance_LSFT_reset(qk_tap_dance_state_t * state, void * user_data) { void dance_LSFT_reset(qk_tap_dance_state_t * state, void * user_data) {
if (state -> count == 1 || keymap_config.no_gui) { if (state -> count == 1 || keymap_config.no_gui) {
unregister_code16(KC_LSFT); unregister_code(KC_LSFT);
} else { } else {
unregister_code(KC_CAPS); unregister_code(KC_CAPS);
unregister_code16(KC_LSFT); unregister_code(KC_LSFT);
} }
} }
// Tap Dance definitions // Tap Dance definitions
qk_tap_dance_action_t tap_dance_actions[] = { qk_tap_dance_action_t tap_dance_actions[] = {
// Tap once for shift, twice for Caps Lock // Tap once for shift, twice for Caps Lock
[TD_LSFT_CAPSLOCK] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS), [TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(dance_LSFT_each_tap, NULL, dance_LSFT_reset)
[TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(dance_LSFT_each_tap, NULL, dance_LSFT_reset),
// Tap once for Escape, twice to reset to base layer
[TD_ESC_BASELYR] = ACTION_TAP_DANCE_LAYER_MOVE(KC_ESC, _BASE),
}; };
#endif // TD_LSFT_CAPSLOCK_ENABLE
// RGB NIGHT MODE // RGB NIGHT MODE
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
@ -126,209 +126,373 @@ __attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *
bool process_record_user(uint16_t keycode, keyrecord_t * record) { bool process_record_user(uint16_t keycode, keyrecord_t * record) {
mod_state = get_mods(); mod_state = get_mods();
if (!process_record_keymap(keycode, record)) { if (!process_record_keymap(keycode, record)) { return false; }
return false; if (!process_capsnum(keycode, record)) { return false; }
} if (!process_esc_to_base(keycode, record)) { return false; }
if (!process_caps_word(keycode, record)) { // Key macros ...
return false;
}
// Your macros ...
switch (keycode) { switch (keycode) {
// DotCom domain macros // User configuration toggles
case DOTCOM: case PRNCONF: // Print verbose status of all user_config toggles (open a text editor before engaging!!)
if (record -> event.pressed) { if (record->event.pressed) {
SEND_STRING(".com"); //send_string("Left bracket with alt numcodes "SS_LALT(SS_TAP(X_KP_0) SS_TAP(X_KP_0) SS_TAP(X_KP_9) SS_TAP(X_KP_1))"\n");
} else { send_string("\n\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C");
// when keycode is released send_string(" gourdo1\x27s GMMK Pro User Settings ");
send_string("\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\n");
send_string("Hold \x5B \bFn\x5D and the number corresponding to a setting below to toggle.\n");
send_string("Re-print this screen with \x5B \bFn\x5D \x5B`\x5D to see your changes reflected.\n");
send_string("Config also visible as RGB under number keys by holding \x5B \bFn\x5D.\n");
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n");
send_string("1. CapsLock RGB highlight alpha keys................ ");
if (user_config.rgb_hilite_caps) {
send_string("\x5BON\x5D\n");
} else {
send_string("\x5BOFF\x5D\n");
}
send_string("2. Numpad RGB highlight layer keys.................. ");
if (user_config.rgb_hilite_numpad) {
send_string("\x5BON\x5D\n");
} else {
send_string("\x5BOFF\x5D\n");
}
send_string("3. Double tap ESC to revert to BASE layer........... ");
if (user_config.esc_double_tap_to_baselyr) {
send_string("\x5BON\x5D\n");
} else {
send_string("\x5BOFF\x5D\n");
}
send_string("4. DEL \x26 HOME key locations......................... ");
if (user_config.del_right_home_top) {
send_string("\x5BHOME on F13\x3B DEL right of BKSPC\x5D\n");
} else {
send_string("\x5B \bDEL on F13\x3B HOME right of BKSPC\x5D\n");
}
send_string("5. Numpad on CapsLock\x3B double tap LSHIFT for Caps... ");
if (user_config.double_tap_shift_for_capslock) {
send_string("\x5BON\x5D\n");
} else {
send_string("\x5BOFF\x5D\n");
}
send_string("6. Encoder button function.......................... ");
if (user_config.encoder_press_mute_or_media) {
send_string("\x5BMUTE\x5D\n");
} else {
send_string("\x5BMEDIA PLAY\x2FPAUSE\x5D\n");
}
send_string("7. Insert function accessed with.................... ");
if (user_config.ins_on_shft_bkspc_or_del) {
send_string("\x5BSHIFT\x2D \bBKSPC\x5D\n");
} else {
send_string("\x5BSHIFT\x2D \bDEL\x5D\n");
}
send_string("8. Force SHIFT \x26 CTRL\x2DSPACE to function like SPACE.. ");
if (user_config.disable_space_mods) {
send_string("\x5BON\x5D\n");
} else {
send_string("\x5BOFF\x5D\n");
}
send_string("\nThe latest firmware updates are always here\x3a https\x3a\x2F\x2Fgithub.com\x2Fgourdo1\x2Fgmmkpro\x2Dmedia\n");
} }
break; break;
case YAHOO:
if (record -> event.pressed) {
SEND_STRING("yahoo.com");
} else {
// when keycode is released
}
break;
case OUTLOOK:
if (record -> event.pressed) {
SEND_STRING("outlook.com");
} else {
// when keycode is released
}
break;
case GMAIL:
if (record -> event.pressed) {
SEND_STRING("gmail.com");
} else {
// when keycode is released
}
break;
case HOTMAIL:
if (record -> event.pressed) {
SEND_STRING("hotmail.com");
} else {
// when keycode is released
}
break;
/*
case YAHOO:
if (record -> event.pressed) SEND_STRING("yahoo.com");
else unregister_code16(keycode);
break;
case OUTLOOK:
if (record -> event.pressed) SEND_STRING("outlook.com");
else unregister_code16(keycode);
break;
case GMAIL:
if (record -> event.pressed) SEND_STRING("gmail.com");
else unregister_code16(keycode);
break;
case HOTMAIL:
if (record -> event.pressed) {
SEND_STRING("hotmail.com");
} else unregister_code16(keycode);
break;
case DOTCOM:
if (record -> event.pressed) SEND_STRING(".com");
else unregister_code16(keycode);
break;
*/
// Windows key lock case TG_CAPS: // Toggle RGB highlighting of Capslock state
case KC_WINLCK: if (record->event.pressed) {
user_config.rgb_hilite_caps ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_PAD: // Toggle RGB highlighting of Numpad state
if (record->event.pressed) {
user_config.rgb_hilite_numpad ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_ESC: // Toggle alternate ESC functionality
if (record->event.pressed) {
user_config.esc_double_tap_to_baselyr ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_DEL: // Toggle alternate placement of DEL and HOME keys
if (record->event.pressed) {
user_config.del_right_home_top ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_TDCAP: // Toggle alternate Capslock/Numpad functionality
if (record->event.pressed) {
user_config.double_tap_shift_for_capslock ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_ENC: // Toggle Encoder function
if (record->event.pressed) {
user_config.encoder_press_mute_or_media ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_INS: // Toggle Encoder function
if (record->event.pressed) {
user_config.ins_on_shft_bkspc_or_del ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
case TG_SPCMOD: // Toggle forcing SHIFT&CTRL-SPACE to function like SPACE
if (record->event.pressed) {
user_config.disable_space_mods ^= 1; // Toggles the status
eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
}
break;
//return false;
// Key to the left of encoder function (default HOME)
case LEFTOFENC:
if (!(user_config.del_right_home_top)) {
if (!(user_config.ins_on_shft_bkspc_or_del)) {
static bool inskey_registered;
if (record -> event.pressed) {
// Detect the activation of either shift keys
if (mod_state & MOD_MASK_SHIFT) {
// First temporarily canceling both shifts so that
// shift isn't applied to the KC_INS keycode
del_mods(MOD_MASK_SHIFT);
register_code(KC_INS);
// Update the boolean variable to reflect the status of KC_INS
inskey_registered = true;
// Reapplying modifier state so that the held shift key(s)
// still work even after having tapped the key.
set_mods(mod_state);
return false;
} else {
register_code(KC_DEL);
return false;
}
} else { // on release of KC_DEL
// In case KC_INS is still being sent even after the release of KC_DEL
if (inskey_registered) {
unregister_code(KC_INS);
inskey_registered = false;
return false;
} else {
unregister_code(KC_DEL);
return false;
}
}
} else {
if (record -> event.pressed) {
register_code(KC_DEL);
return false;
} else {
unregister_code(KC_DEL);
return false;
}
}
} else {
if (record -> event.pressed) {
register_code(KC_HOME);
return false;
} else {
unregister_code(KC_HOME);
return false;
}
}
break;
// Key below encoder function (default DEL)
case BELOWENC:
if (user_config.del_right_home_top) {
if (!(user_config.ins_on_shft_bkspc_or_del)) {
static bool inskey_registered;
if (record -> event.pressed) {
// Detect the activation of either shift keys
if (mod_state & MOD_MASK_SHIFT) {
// First temporarily canceling both shifts so that
// shift isn't applied to the KC_INS keycode
del_mods(MOD_MASK_SHIFT);
register_code(KC_INS);
// Update the boolean variable to reflect the status of KC_INS
inskey_registered = true;
// Reapplying modifier state so that the held shift key(s)
// still work even after having tapped the key.
set_mods(mod_state);
return false;
} else {
register_code(KC_DEL);
return false;
}
} else { // on release of KC_DEL
// In case KC_INS is still being sent even after the release of KC_DEL
if (inskey_registered) {
unregister_code(KC_INS);
inskey_registered = false;
return false;
} else {
unregister_code(KC_DEL);
return false;
}
}
} else {
if (record -> event.pressed) {
register_code(KC_DEL);
return false;
} else {
unregister_code(KC_DEL);
return false;
}
}
} else {
if (record -> event.pressed) {
register_code(KC_HOME);
return false;
} else {
unregister_code(KC_HOME);
return false;
}
}
break;
// Encoder button function
case ENCFUNC:
if (user_config.encoder_press_mute_or_media) {
if (record -> event.pressed) {
register_code(KC_MUTE);
} else unregister_code16(keycode);
}
else {
if (record -> event.pressed) {
register_code(KC_MPLY);
} else unregister_code16(keycode);
}
break;
// DotCom domain macros
case DOTCOM:
if (record -> event.pressed) {
send_string(".com");
} else {
// when keycode is released
}
break;
case YAHOO:
if (record -> event.pressed) {
send_string("yahoo.com");
} else {
// when keycode is released
}
break;
case OUTLOOK:
if (record -> event.pressed) {
send_string("outlook.com");
} else {
// when keycode is released
}
break;
case GMAIL:
if (record -> event.pressed) {
send_string("gmail.com");
} else {
// when keycode is released
}
break;
case HOTMAIL:
if (record -> event.pressed) {
send_string("hotmail.com");
} else {
// when keycode is released
}
break;
// Windows Key lockout
case WINLOCK:
if (record -> event.pressed) { if (record -> event.pressed) {
keymap_config.no_gui = !keymap_config.no_gui; //toggle status keymap_config.no_gui = !keymap_config.no_gui; //toggle status
} else unregister_code16(keycode); } else unregister_code16(keycode);
break; break;
// Double Zero // Double Zero
case KC_00: case KC_00:
if (record -> event.pressed) { if (record -> event.pressed) {
// when keycode KC_00 is pressed // when keycode KC_00 is pressed
SEND_STRING("00"); send_string("00");
} else unregister_code16(keycode); } else unregister_code16(keycode);
break; break;
// Treat Control+Space as if regular Space // Treat Control & Shift-Space as if regular Space
case KC_SPC: { case KC_SPC:
// Initialize a boolean variable that keeps track of the space key status: registered or not? if (user_config.disable_space_mods) {
static bool spckey_registered; // Initialize a boolean variable that keeps track of the space key status: registered or not?
if (record -> event.pressed) { static bool spckey_registered;
// Detect the activation of either ctrl keys if (record -> event.pressed) {
if (mod_state & MOD_MASK_CTRL) { // Detect the activation of either ctrl keys
// First temporarily canceling both ctrls so that if (mod_state & MOD_MASK_CTRL) {
// ctrl isn't applied to the KC_SPC keycode // First temporarily canceling both ctrls so that
del_mods(MOD_MASK_CTRL); // ctrl isn't applied to the KC_SPC keycode
register_code(KC_SPC); del_mods(MOD_MASK_CTRL);
// Update the boolean variable to reflect the status of KC_SPC register_code(KC_SPC);
spckey_registered = true; // Update the boolean variable to reflect the status of KC_SPC
// Reapplying modifier state so that the held ctrl key(s) spckey_registered = true;
// still work even after having tapped the Space key. // Reapplying modifier state so that the held ctrl key(s)
set_mods(mod_state); // still work even after having tapped the Space key.
return false; set_mods(mod_state);
return false;
}
else if (mod_state & MOD_MASK_SHIFT) {
// First temporarily canceling both shifts so that
// shift isn't applied to the KC_SPC keycode
del_mods(MOD_MASK_SHIFT);
register_code(KC_SPC);
// Update the boolean variable to reflect the status of KC_SPC
spckey_registered = true;
// Reapplying modifier state so that the held shift key(s)
// still work even after having tapped the Space key.
set_mods(mod_state);
return false;
}
} else { // on release of KC_SPC
// In case KC_SPC is still being sent even after the release of KC_SPC
if (spckey_registered) {
unregister_code(KC_SPC);
spckey_registered = false;
return false;
}
} }
} else { // on release of KC_SPC
// In case KC_SPC is still being sent even after the release of KC_SPC
if (spckey_registered) {
unregister_code(KC_SPC);
spckey_registered = false;
return false;
}
}
} }
break; break;
// Treat Shift+Space as if regular Space // INS as SHIFT-modified BackSpace key
case KC_SHIFTSPC: {
// Initialize a boolean variable that keeps track of the space key status: registered or not?
static bool spc2key_registered;
if (record -> event.pressed) {
// Detect the activation of either shift keys
if (mod_state & MOD_MASK_SHIFT) {
// First temporarily canceling both shifts so that
// shift isn't applied to the KC_SPC keycode
del_mods(MOD_MASK_SHIFT);
register_code(KC_SPC);
// Update the boolean variable to reflect the status of KC_SPC
spc2key_registered = true;
// Reapplying modifier state so that the held shift key(s)
// still work even after having tapped the Space key.
set_mods(mod_state);
return false;
}
} else { // on release of KC_SPC
// In case KC_SPC is still being sent even after the release of KC_SPC
if (spc2key_registered) {
unregister_code(KC_SPC);
spc2key_registered = false;
return false;
}
}
}
break;
// Add INS as SHIFT-modified BackSpace key
case KC_BSPC: { case KC_BSPC: {
// Initialize a boolean variable that keeps track of the delete key status: registered or not? if (user_config.ins_on_shft_bkspc_or_del) {
static bool inskey_registered; // Initialize a boolean variable that keeps track of the ins key status: registered or not?
if (record -> event.pressed) { static bool inskey_registered;
// Detect the activation of either shift keys if (record -> event.pressed) {
if (mod_state & MOD_MASK_SHIFT) { // Detect the activation of either shift keys
// First temporarily canceling both shifts so that if (mod_state & MOD_MASK_SHIFT) {
// shift isn't applied to the KC_INS keycode // First temporarily canceling both shifts so that
del_mods(MOD_MASK_SHIFT); // shift isn't applied to the KC_INS keycode
register_code(KC_INS); del_mods(MOD_MASK_SHIFT);
// Update the boolean variable to reflect the status of KC_INS register_code(KC_INS);
inskey_registered = true; // Update the boolean variable to reflect the status of KC_INS
// Reapplying modifier state so that the held shift key(s) inskey_registered = true;
// still work even after having tapped the Delete/Insert key. // Reapplying modifier state so that the held shift key(s)
set_mods(mod_state); // still work even after having tapped the key.
return false; set_mods(mod_state);
} return false;
} else { // on release of KC_BSPC }
// In case KC_INS is still being sent even after the release of KC_BSPC } else { // on release of KC_BSPC
if (inskey_registered) { // In case KC_INS is still being sent even after the release of KC_BSPC
unregister_code(KC_INS); if (inskey_registered) {
inskey_registered = false; unregister_code(KC_INS);
return false; inskey_registered = false;
return false;
}
} }
} }
} }
break; break;
/* Add INS as SHIFT-modified DEL key
case KC_DEL: {
// Initialize a boolean variable that keeps track of the delete key status: registered or not?
static bool inskey_registered;
if (record->event.pressed) {
// Detect the activation of either shift keys
if (mod_state & MOD_MASK_SHIFT) {
// First temporarily canceling both shifts so that
// shift isn't applied to the KC_INS keycode
del_mods(MOD_MASK_SHIFT);
register_code(KC_INS);
// Update the boolean variable to reflect the status of KC_INS
inskey_registered = true;
// Reapplying modifier state so that the held shift key(s)
// still work even after having tapped the Delete/Insert key.
set_mods(mod_state);
return false;
}
} else { // on release of KC_DEL
// In case KC_INS is still being sent even after the release of KC_DEL
if (inskey_registered) {
unregister_code(KC_INS);
inskey_registered = false;
return false;
}
}
}
break;
*/
#ifdef IDLE_TIMEOUT_ENABLE #ifdef IDLE_TIMEOUT_ENABLE
case RGB_TOI: case RGB_TOI:
@ -352,27 +516,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
#ifdef EMOTICON_ENABLE #ifdef EMOTICON_ENABLE
case EMO_SHRUG: case EMO_SHRUG:
if (record -> event.pressed) SEND_STRING("`\\_(\"/)_/`"); if (record -> event.pressed) send_string("`\\_(\"/)_/`");
else unregister_code16(keycode); else unregister_code16(keycode);
break; break;
case EMO_CONFUSE: case EMO_CONFUSE:
if (record -> event.pressed) SEND_STRING("(*_*)"); if (record -> event.pressed) send_string("(*_*)");
else unregister_code16(keycode); else unregister_code16(keycode);
break; break;
case EMO_TEARS: case EMO_TEARS:
if (record -> event.pressed) SEND_STRING("(T_T)"); if (record -> event.pressed) send_string("(T_T)");
else unregister_code16(keycode); else unregister_code16(keycode);
break; break;
case EMO_NERVOUS: case EMO_NERVOUS:
if (record -> event.pressed) SEND_STRING("(~_~;)"); if (record -> event.pressed) send_string("(~_~;)");
else unregister_code16(keycode); else unregister_code16(keycode);
break; break;
case EMO_JOY: case EMO_JOY:
if (record -> event.pressed) SEND_STRING("(^o^)"); if (record -> event.pressed) send_string("(^o^)");
else unregister_code16(keycode); else unregister_code16(keycode);
break; break;
case EMO_SAD: case EMO_SAD:
if (record -> event.pressed) SEND_STRING(":'-("); if (record -> event.pressed) send_string(":'-(");
else unregister_code16(keycode); else unregister_code16(keycode);
break; break;
#endif // EMOTICON_ENABLE #endif // EMOTICON_ENABLE
@ -398,15 +562,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
return true; return true;
}; };
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t * record) { // Define custom Caps Word continuity characters
bool caps_word_press_user(uint16_t keycode) {
switch (keycode) { switch (keycode) {
case KC_SFTUP: // Keycodes that continue Caps Word, with shift applied.
return 300; case KC_A ... KC_Z:
case KC_RAISESPC: case KC_TILD:
case KC_LOWERSPC: case KC_UNDS:
return 450; case KC_DQT:
default: case KC_COLN:
return TAPPING_TERM; case KC_RSFT:
case LSFTCAPSWIN:
add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key.
return true;
// Keycodes that continue Caps Word, without shifting.
case KC_1 ... KC_0:
case KC_GRV:
case KC_MINS:
case KC_QUOT:
case KC_SCLN:
case KC_BSPC:
case KC_DEL:
return true;
default:
return false; // Deactivate Caps Word.
} }
} }
@ -418,15 +599,32 @@ void activate_numlock(bool turn_on) {
} }
// INITIAL STARTUP // INITIAL STARTUP
__attribute__((weak)) void keyboard_post_init_keymap(void) {
__attribute__((weak)) void keyboard_post_init_keymap(void) {} }
void keyboard_post_init_user(void) { void keyboard_post_init_user(void) {
// Read the user config from EEPROM
user_config.raw = eeconfig_read_user();
keyboard_post_init_keymap(); keyboard_post_init_keymap();
#ifdef STARTUP_NUMLOCK_ON #ifdef STARTUP_NUMLOCK_ON
activate_numlock(true); // turn on Num lock by default so that the numpad layer always has predictable results activate_numlock(true); // turn on Num lock by default so that the numpad layer always has predictable results
#endif // STARTUP_NUMLOC_ON #endif // STARTUP_NUMLOCK_ON
#ifdef IDLE_TIMEOUT_ENABLE #ifdef IDLE_TIMEOUT_ENABLE
timeout_timer = timer_read(); // set inital time for ide timeout timeout_timer = timer_read(); // set initial time for idle timeout
#endif #endif
} }
/* Set defaults for EEPROM user configuration variables */
void eeconfig_init_user(void) {
user_config.raw = 0;
user_config.rgb_hilite_caps = true;
user_config.rgb_hilite_numpad = true;
user_config.double_tap_shift_for_capslock = true;
user_config.del_right_home_top = true;
user_config.encoder_press_mute_or_media = true;
user_config.esc_double_tap_to_baselyr = true;
user_config.ins_on_shft_bkspc_or_del = true;
user_config.disable_space_mods = true;
eeconfig_update_user(user_config.raw);
}

View file

@ -1,5 +1,5 @@
/* Copyright 2021 Jonavin Eng @Jonavin /* Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <jcblake@outlook.com> Copyright 2022 gourdo1 <gourdo1@outlook.com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -20,36 +20,49 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// DEFINE MACROS // DEFINE MACROS
#define ARRAYSIZE(arr) sizeof(arr) / sizeof(arr[0]) #define ARRAYSIZE(arr) sizeof(arr) / sizeof(arr[0])
// LAYERS // LAYERS -- Note: to avoid compile problems, make sure total layers matches DYNAMIC_KEYMAP_LAYER_COUNT defined in config.h (where _COLEMAK layer is defined)
enum custom_user_layers { enum custom_user_layers {
_BASE, _BASE,
_FN1, _FN1,
_NUMPADMOUSE, _NUMPADMOUSE,
_MOUSEKEY, _MOUSEKEY,
#ifdef GAME_ENABLE
_GAME
#endif //GAME_ENABLE
}; };
#define KC_CAD LALT(LCTL(KC_DEL)) #define KC_CAD LALT(LCTL(KC_DEL))
#define LOCKPC LGUI(KC_L)
#define KC_AF4 LALT(KC_F4) #define KC_AF4 LALT(KC_F4)
#define KC_TASK LCTL(LSFT(KC_ESC)) #define KC_TASK LCTL(LSFT(KC_ESC))
#define CT_PGUP RCTL(KC_PGUP) #define CT_PGUP RCTL(KC_PGUP)
#define CT_PGDN RCTL(KC_PGDN) #define CT_PGDN RCTL(KC_PGDN)
#define CT_HOME RCTL(KC_HOME) #define CT_HOME RCTL(KC_HOME)
#define CT_END RCTL(KC_END) #define CT_END RCTL(KC_END)
#define KC_SFTUP RSFT_T(KC_UP) // Shift when held, Up arrow when tapped #define SWAP_L SGUI(KC_LEFT) // Swap application to left display
#define KC_RAISESPC LT(_MOUSEKEY, KC_SPC) // _MOUSEKEY layer mod when held, space when tapped #define SWAP_R SGUI(KC_RGHT) // Swap application to right display
#define KC_LOWERSPC LT(_NUMPADMOUSE, KC_SPC) // _NUMPAD-MOUSE layer mod when held, space when tapped
#define KC_SHIFTSPC LSFT(KC_SPC)
#define SWAP_L SGUI(KC_LEFT) // Swap application to left display
#define SWAP_R SGUI(KC_RGHT) // Swap application to right display
// KEYCODES // KEYCODES
enum custom_user_keycodes { enum custom_user_keycodes {
KC_00 = SAFE_RANGE, KC_00 = SAFE_RANGE,
ENCFUNC, ENCFUNC, // Encoder function
KC_WINLCK, // Toggles Win key on and off CAPSNUM, // Capslock key function
LEFTOFENC, // Key to the left of the encoder (i.e. F13)
BELOWENC, // Key below encoder
PRNCONF, // Print verbose statuses of all user_config toggles
WINLOCK, // Toggles Windows key on and off
RGB_TOI, // Timeout idle time up RGB_TOI, // Timeout idle time up
RGB_TOD, // Timeout idle time down RGB_TOD, // Timeout idle time down
RGB_NITE, // Turns off all rgb but allow rgb indicators to work RGB_NITE, // Disables RGB backlighting effects but allows RGB indicators to still work
TG_CAPS, // Toggles RGB highlighting of alphas during capslock
TG_PAD, // Toggles RGB highlighting of keys on numpad+mousekeys layer
TG_TDCAP, // Toggles double tap shift (tapdance) for CapsLock
TG_DEL, // Swaps DEL and HOME key locations
TG_ENC, // Toggle Encoder functionality
TG_ESC, // Toggle ESC tapdance for _BASE layer
TG_INS, // Toggle location of INS
TG_SPCMOD, // Toggle disabling of modded-SPACE functions
YAHOO, // yahoo.com YAHOO, // yahoo.com
OUTLOOK, // outlook.com OUTLOOK, // outlook.com
@ -66,24 +79,33 @@ enum custom_user_keycodes {
KC_TSTOG, // Tab Scroll Toggle KC_TSTOG, // Tab Scroll Toggle
NEW_SAFE_RANGE // new safe range for keymap level custom keycodes NEW_SAFE_RANGE // New safe range for keymap level custom keycodes
}; };
#ifdef TD_LSFT_CAPSLOCK_ENABLE
// Tap Dance Definitions // Tap Dance Definitions
enum custom_tapdance { enum custom_tapdance {
TD_LSFT_CAPSLOCK,
TD_LSFT_CAPS_WIN, TD_LSFT_CAPS_WIN,
TD_ESC_BASELYR
}; };
#define KC_LSFTCAPS TD(TD_LSFT_CAPSLOCK)
#define KC_LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN) // Set up boolean variables to track user customizable configuration options
#define KC_ESCLYR TD(TD_ESC_BASELYR) typedef union {
#else // regular Shift uint32_t raw;
#define KC_LSFTCAPS KC_LSFT struct {
// regular Escape bool rgb_hilite_caps :1;
#define KC_ESCLYR KC_ESC bool rgb_hilite_numpad :1;
#endif // TD_LSFT_CAPSLOCK_ENABLE bool esc_double_tap_to_baselyr :1;
bool del_right_home_top :1;
bool double_tap_shift_for_capslock :1;
bool encoder_press_mute_or_media :1;
bool ins_on_shft_bkspc_or_del :1;
bool disable_space_mods :1;
};
} user_config_t;
user_config_t user_config;
#define LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN)
// ENCODER ACTIONS // ENCODER ACTIONS
#ifdef ENCODER_ENABLE #ifdef ENCODER_ENABLE

View file

@ -1,5 +1,5 @@
/* Copyright 2021 Jonavin Eng @Jonavin /* Copyright 2021 Jonavin Eng @Jonavin
Copyright 2022 gourdo1 <jcblake@outlook.com> Copyright 2022 gourdo1 <gourdo1@outlook.com>
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
#include "gourdo1.h" #include "gourdo1.h"
#ifdef ENCODER_ENABLE #ifdef ENCODER_ENABLE