diff options
18 files changed, 2674 insertions, 600 deletions
diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/caps_word.c b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/caps_word.c deleted file mode 100644 index d2f7b6ee7f..0000000000 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/caps_word.c +++ /dev/null @@ -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. -  } -} - diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/caps_word.h b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/caps_word.h deleted file mode 100644 index 7f58dd3f17..0000000000 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/caps_word.h +++ /dev/null @@ -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); - diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/config.h b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/config.h index 582e473cb2..a37fb08d31 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/config.h +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/config.h @@ -1,5 +1,5 @@  /* 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  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 +// Force n-key rollover +#define FORCE_NKRO + +// Set TT to two taps  #define TAPPING_TOGGLE 2 -// TT set to two taps -/* Handle GRAVESC combo keys */ +#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 @@ -31,19 +42,79 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define TAPPING_TERM_PER_KEY  #ifdef RGB_MATRIX_ENABLE -#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR -#define RGB_DISABLE_WHEN_USB_SUSPENDED -#endif +    #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 -// 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) +    // 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 fifth layer for colemak  -- set "COLEMAK_LAYER_ENABLE = yes" in rules.mk to enable +// Add a layer for colemak  -- set "COLEMAK_LAYER_ENABLE = yes" in rules.mk to enable  #if defined COLEMAK_LAYER_ENABLE -#define DYNAMIC_KEYMAP_LAYER_COUNT 5 -#define _COLEMAK 4 +    #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  /* diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c index 97db98dd12..050152b47d 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c @@ -1,7 +1,7 @@  /* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>     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  it under the terms of the GNU General Public License as published by  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/>.  */ -// 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 @@ -24,6 +24,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "gourdo1.h" +#include "paddlegame.h" + +#include <math.h> +  const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      /* Base Layout @@ -44,39 +48,60 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {       */      [_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_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_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_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, -        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, +        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, +        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      ),      /* 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|       * |------+------+------+------+------+------+------+------+------+------+------+------+------+----------++------| -     * |  ______ |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  |       * |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------| -     * |  __________  |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| ____ | ______ ||RGBMOD|| ____ | +     * |  __________  |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,  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,  _______, +        _______, 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,          _______, -        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 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, -        KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______,   GMAIL, HOTMAIL, _______, _______, _______, _______, _______,          _______,          KC_END, -        _______,          RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______,  DOTCOM,  KC_CAD,          _______, RGB_MOD, _______, +        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      ), +    #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. @@ -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_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_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( @@ -115,19 +140,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      #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_DEL,           KC_MUTE, -        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_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_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_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_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_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)        +    if (clockwise)          rgblight_increase_hue_noeeprom();      else          rgblight_decrease_hue_noeeprom(); @@ -154,6 +179,18 @@ bool encoder_update_user(uint8_t index, bool clockwise) {              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; @@ -165,6 +202,45 @@ bool encoder_update_user(uint8_t index, bool clockwise) {  #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); @@ -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_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 @@ -197,12 +274,19 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {      // CapsLock RGB setup      if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { -        for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) { -            rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE); +        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);          } -        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 @@ -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_SPC, 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_RCTL, RGB_RED); +        //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); @@ -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_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_CYAN); +        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_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 -            rgb_matrix_set_color(LED_LIST_NUMROW[10], RGB_CYAN); -            rgb_matrix_set_color(LED_LIST_NUMROW[11], RGB_CYAN); -            rgb_matrix_set_color(LED_LIST_NUMROW[12], RGB_CYAN); +            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: -        for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) { -            rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE); +        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);          } -        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;          // 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_PGUP, RGB_OFFBLUE);          rgb_matrix_set_color(LED_PGDN, RGB_OFFBLUE); -          break; -    // Colemak layer RGB -    #ifdef COLEMAK_LAYER_ENABLE +        // 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 +        #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;      }  } @@ -329,8 +676,6 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {  void keyboard_post_init_keymap(void) {      // keyboard_post_init_user() moved to userspace      #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      #endif  }
\ No newline at end of file diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/paddlegame.h b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/paddlegame.h new file mode 100644 index 0000000000..3d33975cfe --- /dev/null +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/paddlegame.h @@ -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
\ No newline at end of file diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md index 3db6923d76..c378276434 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md @@ -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.   @@ -8,26 +8,51 @@ This Windows-centric layout is based on [Jonavin's](https://github.com/qmk/qmk_f  ### 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)  * 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 -* 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) -* Domain shortcuts: FN+.=".com", FN+O="outlook.com", FN+Y="yahoo.com", FN+H="hotmail.com", FN+G="gmail.com". (added Apr 7, 2022) +* [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? 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 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) -* 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  * 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) +* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13 +* [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) +* 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)  * 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 & 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.  * [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 @@ -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  * 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 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 -* RGB indicators on left side LEDs: Capslock (green), Scroll Lock (red), and Num Lock not set (orange)  -* FN + Z to turn off RGB backlighting; press again to toggle +* 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 June 28, 2022) +    *  F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes +* [FN]Z to turn off RGB backlighting (indicator lights still work); 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 -* 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]\ to get to bootloader mode +* [FN][ESC] to clear EEPROM (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 -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 @@ -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 -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  ### Base layer - + -### Fn Layer - +### FN Layer +  ### Layer 2 (Numpad) - +  ### COLEMAK layer   diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rgb_matrix_map.h b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rgb_matrix_map.h index 38da50754b..f1609a4bb3 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rgb_matrix_map.h +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rgb_matrix_map.h @@ -1,5 +1,5 @@  /* 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  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 + +//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 @@ -194,7 +199,7 @@ const uint8_t LED_LIST_NUMROW[] = {  };  const uint8_t LED_LIST_LETTERS[] = { -    LED_1, +/*    LED_1,      LED_2,      LED_3,      LED_4, @@ -203,7 +208,7 @@ const uint8_t LED_LIST_LETTERS[] = {      LED_7,      LED_8,      LED_9, -    LED_0, +    LED_0, */      LED_Q,      LED_W,      LED_E, @@ -284,4 +289,122 @@ const uint8_t LED_SIDE_RIGHT[] = {      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
\ No newline at end of file diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk index b236d9132c..585f7846dd 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk @@ -1,18 +1,18 @@ -SRC += caps_word.c -  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 +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  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 diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/config.h b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/config.h new file mode 100644 index 0000000000..a37fb08d31 --- /dev/null +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/config.h @@ -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) diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c new file mode 100644 index 0000000000..24a1e8a359 --- /dev/null +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c @@ -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 +}
\ No newline at end of file diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/paddlegame.h b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/paddlegame.h new file mode 100644 index 0000000000..3d33975cfe --- /dev/null +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/paddlegame.h @@ -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
\ No newline at end of file diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md new file mode 100644 index 0000000000..31f4539fde --- /dev/null +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md @@ -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. + + + +## 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 + + +### Fn Layer + + +### Layer 2 (Numpad) + + +### COLEMAK layer + diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h new file mode 100644 index 0000000000..36e42ee7f4 --- /dev/null +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h @@ -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
\ No newline at end of file diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk new file mode 100644 index 0000000000..37e81e3dbb --- /dev/null +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk @@ -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 diff --git a/users/gourdo1/custom_double_taps.h b/users/gourdo1/custom_double_taps.h new file mode 100644 index 0000000000..4f551e1fa1 --- /dev/null +++ b/users/gourdo1/custom_double_taps.h @@ -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; +} diff --git a/users/gourdo1/gourdo1.c b/users/gourdo1/gourdo1.c index b964729be9..9062a452ff 100644 --- a/users/gourdo1/gourdo1.c +++ b/users/gourdo1/gourdo1.c @@ -1,6 +1,6 @@  /* 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  it under the terms of the GNU General Public License as published by  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 "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 in not disabled +// Tap once for shift, twice for Caps Lock but only if Win Key is not disabled (also disabled by user.config variable)  void dance_LSFT_each_tap(qk_tap_dance_state_t * state, void * user_data) { -    if (state -> count == 1 || keymap_config.no_gui) { -        register_code16(KC_LSFT); +    if (user_config.double_tap_shift_for_capslock) { +        if (state -> count == 1 || keymap_config.no_gui) { +            register_code(KC_LSFT); +        } else { +            register_code(KC_CAPS); +        }      } else { -        register_code(KC_CAPS); +        register_code(KC_LSFT);      }  }  void dance_LSFT_reset(qk_tap_dance_state_t * state, void * user_data) {      if (state -> count == 1 || keymap_config.no_gui) { -        unregister_code16(KC_LSFT); +        unregister_code(KC_LSFT);      } else {          unregister_code(KC_CAPS); -        unregister_code16(KC_LSFT); +        unregister_code(KC_LSFT);      }  } +  // Tap Dance definitions  qk_tap_dance_action_t tap_dance_actions[] = {      // 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), -    // Tap once for Escape, twice to reset to base layer -    [TD_ESC_BASELYR] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _BASE), +    [TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(dance_LSFT_each_tap, NULL, dance_LSFT_reset)  }; -#endif // TD_LSFT_CAPSLOCK_ENABLE  // RGB NIGHT MODE  #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) {      mod_state = get_mods(); -    if (!process_record_keymap(keycode, record)) { -        return false; -    } - -    if (!process_caps_word(keycode, record)) { -        return false; -    } +    if (!process_record_keymap(keycode, record)) { return false; } +    if (!process_capsnum(keycode, record)) { return false; } +    if (!process_esc_to_base(keycode, record)) { return false; } -    // Your macros ... +    // Key macros ...      switch (keycode) { -    // DotCom domain macros +        // User configuration toggles +    case PRNCONF:  // Print verbose status of all user_config toggles (open a text editor before engaging!!) +        if (record->event.pressed) { +            //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"); +            send_string("\n\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C"); +            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; + +    case TG_CAPS:  // Toggle RGB highlighting of Capslock state +        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"); +            send_string(".com");          } else {              // when keycode is released          }          break;      case YAHOO:          if (record -> event.pressed) { -            SEND_STRING("yahoo.com"); +            send_string("yahoo.com");          } else {              // when keycode is released          }          break;      case OUTLOOK:          if (record -> event.pressed) { -            SEND_STRING("outlook.com"); +            send_string("outlook.com");          } else {              // when keycode is released          }          break;      case GMAIL:          if (record -> event.pressed) { -            SEND_STRING("gmail.com"); +            send_string("gmail.com");          } else {              // when keycode is released          }          break;      case HOTMAIL:          if (record -> event.pressed) { -            SEND_STRING("hotmail.com"); +            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 KC_WINLCK: +        // Windows Key lockout +    case WINLOCK:          if (record -> event.pressed) {              keymap_config.no_gui = !keymap_config.no_gui; //toggle status          } else unregister_code16(keycode);          break; -    // Double Zero     +        // Double Zero          case KC_00:          if (record -> event.pressed) {              // when keycode KC_00 is pressed -            SEND_STRING("00"); +            send_string("00");          } else unregister_code16(keycode);          break; -    // Treat Control+Space as if regular Space -    case KC_SPC: { -        // Initialize a boolean variable that keeps track of the space key status: registered or not? -        static bool spckey_registered; -        if (record -> event.pressed) { -            // Detect the activation of either ctrl keys -            if (mod_state & MOD_MASK_CTRL) { -                // First temporarily canceling both ctrls so that -                // ctrl isn't applied to the KC_SPC keycode -                del_mods(MOD_MASK_CTRL); -                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 ctrl 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; -            } -        } -        } -        break; - -    // Treat Shift+Space as if regular Space -    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; +        // Treat Control & Shift-Space as if regular Space +    case KC_SPC: +        if (user_config.disable_space_mods) { +            // Initialize a boolean variable that keeps track of the space key status: registered or not? +            static bool spckey_registered; +            if (record -> event.pressed) { +                // Detect the activation of either ctrl keys +                if (mod_state & MOD_MASK_CTRL) { +                    // First temporarily canceling both ctrls so that +                    // ctrl isn't applied to the KC_SPC keycode +                    del_mods(MOD_MASK_CTRL); +                    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 ctrl key(s) +                    // still work even after having tapped the Space key. +                    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; +                }              }          } -        }          break; -    // Add INS as SHIFT-modified BackSpace key +    // INS as SHIFT-modified BackSpace key      case KC_BSPC: { -        // 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_BSPC -            // In case KC_INS is still being sent even after the release of KC_BSPC -            if (inskey_registered) { -                unregister_code(KC_INS); -                inskey_registered = false; -                return false; +        if (user_config.ins_on_shft_bkspc_or_del) { +            // Initialize a boolean variable that keeps track of the ins 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 key. +                    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 +                if (inskey_registered) { +                    unregister_code(KC_INS); +                    inskey_registered = false; +                    return false; +                }              }          } -        } -        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; -    */ +    } +    break;      #ifdef IDLE_TIMEOUT_ENABLE      case RGB_TOI: @@ -352,27 +516,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {          #ifdef EMOTICON_ENABLE      case EMO_SHRUG: -        if (record -> event.pressed) SEND_STRING("`\\_(\"/)_/`"); +        if (record -> event.pressed) send_string("`\\_(\"/)_/`");          else unregister_code16(keycode);          break;      case EMO_CONFUSE: -        if (record -> event.pressed) SEND_STRING("(*_*)"); +        if (record -> event.pressed) send_string("(*_*)");          else unregister_code16(keycode);          break;      case EMO_TEARS: -        if (record -> event.pressed) SEND_STRING("(T_T)"); +        if (record -> event.pressed) send_string("(T_T)");          else unregister_code16(keycode);          break;      case EMO_NERVOUS: -        if (record -> event.pressed) SEND_STRING("(~_~;)"); +        if (record -> event.pressed) send_string("(~_~;)");          else unregister_code16(keycode);          break;      case EMO_JOY: -        if (record -> event.pressed) SEND_STRING("(^o^)"); +        if (record -> event.pressed) send_string("(^o^)");          else unregister_code16(keycode);          break;      case EMO_SAD: -        if (record -> event.pressed) SEND_STRING(":'-("); +        if (record -> event.pressed) send_string(":'-(");          else unregister_code16(keycode);          break;          #endif // EMOTICON_ENABLE @@ -398,15 +562,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {      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) { -    case KC_SFTUP: -        return 300; -    case KC_RAISESPC: -    case KC_LOWERSPC: -        return 450; -    default: -        return TAPPING_TERM; +        // Keycodes that continue Caps Word, with shift applied. +        case KC_A ... KC_Z: +        case KC_TILD: +        case KC_UNDS: +        case KC_DQT: +        case KC_COLN: +        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 - -__attribute__((weak)) void keyboard_post_init_keymap(void) {} +__attribute__((weak)) void keyboard_post_init_keymap(void) { +}  void keyboard_post_init_user(void) { +    // Read the user config from EEPROM +    user_config.raw = eeconfig_read_user();      keyboard_post_init_keymap();      #ifdef STARTUP_NUMLOCK_ON      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 -    timeout_timer = timer_read(); // set inital time for ide timeout +    timeout_timer = timer_read(); // set initial time for idle timeout      #endif -}
\ No newline at end of file +} + +/* 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); +} diff --git a/users/gourdo1/gourdo1.h b/users/gourdo1/gourdo1.h index c6861ca0ca..aa91a192d2 100644 --- a/users/gourdo1/gourdo1.h +++ b/users/gourdo1/gourdo1.h @@ -1,5 +1,5 @@  /* 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  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 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 {      _BASE,      _FN1,      _NUMPADMOUSE,      _MOUSEKEY, +    #ifdef GAME_ENABLE +    _GAME +    #endif //GAME_ENABLE  };  #define KC_CAD LALT(LCTL(KC_DEL)) +#define LOCKPC LGUI(KC_L)  #define KC_AF4 LALT(KC_F4)  #define KC_TASK LCTL(LSFT(KC_ESC))  #define CT_PGUP RCTL(KC_PGUP)  #define CT_PGDN RCTL(KC_PGDN)  #define CT_HOME RCTL(KC_HOME)  #define CT_END RCTL(KC_END) -#define KC_SFTUP RSFT_T(KC_UP) // Shift when held, Up arrow when tapped -#define KC_RAISESPC LT(_MOUSEKEY, KC_SPC) // _MOUSEKEY layer mod when held, space when tapped -#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 +#define SWAP_L SGUI(KC_LEFT)                 // Swap application to left display +#define SWAP_R SGUI(KC_RGHT)                 // Swap application to right display  // KEYCODES  enum custom_user_keycodes {      KC_00 = SAFE_RANGE, -        ENCFUNC, -        KC_WINLCK,     // Toggles Win key on and off +        ENCFUNC,       // Encoder function +        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_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          OUTLOOK,       // outlook.com @@ -66,24 +79,33 @@ enum custom_user_keycodes {          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  enum custom_tapdance { -    TD_LSFT_CAPSLOCK,      TD_LSFT_CAPS_WIN, -    TD_ESC_BASELYR  }; -#define KC_LSFTCAPS TD(TD_LSFT_CAPSLOCK) -#define KC_LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN) -#define KC_ESCLYR TD(TD_ESC_BASELYR) -#else // regular Shift -#define KC_LSFTCAPS KC_LSFT -// regular Escape -#define KC_ESCLYR KC_ESC -#endif // TD_LSFT_CAPSLOCK_ENABLE + +// Set up boolean variables to track user customizable configuration options +typedef union { +  uint32_t raw; +  struct { +    bool     rgb_hilite_caps :1; +    bool     rgb_hilite_numpad :1; +    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  #ifdef ENCODER_ENABLE diff --git a/users/gourdo1/gourdo1_encoder.c b/users/gourdo1/gourdo1_encoder.c index 72f8c3c354..5a19b63c6e 100644 --- a/users/gourdo1/gourdo1_encoder.c +++ b/users/gourdo1/gourdo1_encoder.c @@ -1,5 +1,5 @@  /* 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  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/>.  */ -  #include QMK_KEYBOARD_H +  #include "gourdo1.h"  #ifdef ENCODER_ENABLE  | 
