summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/gourdo1/caps_word.c150
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/gourdo1/caps_word.h127
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/gourdo1/config.h75
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/gourdo1/keymap.c336
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/gourdo1/readme.md97
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/gourdo1/rgb_matrix_map.h287
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/gourdo1/rules.mk18
-rw-r--r--users/gourdo1/gourdo1.c432
-rw-r--r--users/gourdo1/gourdo1.h131
-rw-r--r--users/gourdo1/gourdo1_encoder.c238
-rw-r--r--users/gourdo1/rules.mk29
11 files changed, 1920 insertions, 0 deletions
diff --git a/keyboards/gmmk/pro/ansi/keymaps/gourdo1/caps_word.c b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/caps_word.c
new file mode 100644
index 0000000000..d2f7b6ee7f
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/caps_word.c
@@ -0,0 +1,150 @@
+// 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/ansi/keymaps/gourdo1/caps_word.h b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/caps_word.h
new file mode 100644
index 0000000000..7f58dd3f17
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/caps_word.h
@@ -0,0 +1,127 @@
+// 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/ansi/keymaps/gourdo1/config.h b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/config.h
new file mode 100644
index 0000000000..582e473cb2
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/config.h
@@ -0,0 +1,75 @@
+/* Copyright 2021 Jonavin Eng @Jonavin
+ Copyright 2022 gourdo1 <jcblake@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
+
+#define TAPPING_TOGGLE 2
+// TT set to two taps
+
+/* 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_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR
+#define RGB_DISABLE_WHEN_USB_SUSPENDED
+#endif
+
+// 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)
+
+// add fifth 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
+#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/ansi/keymaps/gourdo1/keymap.c b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/keymap.c
new file mode 100644
index 0000000000..97db98dd12
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/keymap.c
@@ -0,0 +1,336 @@
+/* Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>
+ Copyright 2021 Jonavin Eng @Jonavin
+ Copyright 2022 gourdo1 <jcblake@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"
+
+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 |
+ * |=============================================================================================================|
+ * | ` ~ | 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 | ; : | ' " | Enter || PgDn |
+ * |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
+ * | LShift | Z | X | C | V | B | N | M | , < | . > | / ? | RShift || Up || End |
+ * |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
+ * | Ctrl | Win | LAlt | Space | RAlt | Fn | Ctrl || Left | Down | Rght |
+ * `------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_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_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,
+ 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 || ____ |
+ * |=============================================================================================================|
+ * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |RGBTOD|RGBTOI| ________ ||RGBTOG|
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------+----------++------|
+ * | ______ |RGBSAD|RGBVAI|RGBSAI| NKRO | ____ |YAHOO | ____ | ____ |OUTLK |Pause | ____ | ____ | Reset || Home |
+ * |---------+------+------+------+------+------+------+------+------+------+------+------+------+-------++------|
+ * | Capslock |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | __________ || End |
+ * |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
+ * | __________ |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| ____ | ______ ||RGBMOD|| ____ |
+ * |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
+ * | ____ | WinKyLk | ____ | _____ | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI|
+ * `------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_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, _______,
+ _______, KC_WINLCK, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
+ ),
+
+ /* _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_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_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_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
+ ),
+ #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;
+ 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
+// 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);
+ }
+
+ // 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)) {
+ 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);
+ }
+
+ // 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);
+
+ // 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);
+ 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);
+ } 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);
+ }
+ 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);
+ }
+ 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
+ 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
+ default:
+ break;
+ }
+}
+#endif
+
+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/ansi/keymaps/gourdo1/readme.md b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/readme.md
new file mode 100644
index 0000000000..3db6923d76
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/readme.md
@@ -0,0 +1,97 @@
+# gourdo1's 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.
+
+![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg)
+
+## Features:
+
+### Core Functionality
+
+* [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)
+* 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)
+* 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)
+
+### 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
+* 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)
+* 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
+* 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
+
+### 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
+
+### 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)
+
+Link to latest firmware binary: https://github.com/gourdo1/media/raw/main/gmmk_pro_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 numpad keys, so should generally be off when numpad layer is active.
+
+COLEMAK_LAYER_ENABLE = yes - Enable optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer.
+
+
+## Layer Diagrams
+### Base layer
+![image](https://raw.githubusercontent.com/gourdo1/media/main/base.png)
+
+### Fn Layer
+![image](https://raw.githubusercontent.com/gourdo1/media/main/fn1.png)
+
+### Layer 2 (Numpad)
+![image](https://raw.githubusercontent.com/gourdo1/media/main/numpad.png)
+
+### COLEMAK layer
+![image](https://user-images.githubusercontent.com/71780717/131235050-980d2f54-2d23-4ae8-a83f-9fcdbe60d6cb.png)
diff --git a/keyboards/gmmk/pro/ansi/keymaps/gourdo1/rgb_matrix_map.h b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/rgb_matrix_map.h
new file mode 100644
index 0000000000..38da50754b
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/rgb_matrix_map.h
@@ -0,0 +1,287 @@
+/* Copyright 2021 Jonavin Eng @Jonavin
+ Copyright 2022 gourdo1 <jcblake@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
+// 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_L1, // 67, LED, l01
+ LED_R1, // 68, LED, l11
+ LED_INS, // 69, Prt, k97 -- remapped to INS
+ LED_L2, // 70, LED, l02
+ LED_R2, // 71, LED, l12
+ LED_DEL, // 72, Del, k65
+ LED_L3, // 73, LED, l03
+ LED_R3, // 74, LED, l13
+ LED_PGUP, // 75, PgUp, k15
+ LED_L4, // 76, LED, l04
+ LED_R4, // 77, LED, l14
+ LED_EQL, // 78, =, k66
+ LED_RIGHT, // 79, Right, k05
+ LED_L5, // 80, LED, l05
+ LED_R5, // 81, LED, l15
+ LED_END, // 82, End, k75
+ LED_L6, // 83, LED, l06
+ LED_R6, // 84, LED, l16
+ LED_BSPC, // 85, BSpc, ka1
+ LED_PGDN, // 86, PgDn, k25
+ LED_L7, // 87, LED, l07
+ LED_R7, // 88, LED, l17
+ LED_RBRC, // 89, ], k61
+ LED_RSFT, // 90, Sh_R, k91
+ LED_L8, // 91, LED, l08
+ LED_R8, // 92, LED, l18
+ LED_BSLS, // 93, \, ka2
+ LED_UP, // 94, Up, k35
+ LED_LEFT, // 95, Left, k03
+ LED_ENT, // 96, Enter, ka4
+ LED_DOWN // 97, 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_INS
+};
+
+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
+};
+
+#endif \ No newline at end of file
diff --git a/keyboards/gmmk/pro/ansi/keymaps/gourdo1/rules.mk b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/rules.mk
new file mode 100644
index 0000000000..b236d9132c
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/gourdo1/rules.mk
@@ -0,0 +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
+
+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
diff --git a/users/gourdo1/gourdo1.c b/users/gourdo1/gourdo1.c
new file mode 100644
index 0000000000..b964729be9
--- /dev/null
+++ b/users/gourdo1/gourdo1.c
@@ -0,0 +1,432 @@
+/* Copyright 2021 Jonavin Eng @Jonavin
+ Copyright 2022 gourdo1 <jcblake@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/>.
+*/
+
+#include QMK_KEYBOARD_H
+
+#include "gourdo1.h"
+
+#include "caps_word.h"
+
+#ifdef TD_LSFT_CAPSLOCK_ENABLE
+// Tap once for shift, twice for Caps Lock but only if Win Key in not disabled
+void dance_LSFT_each_tap(qk_tap_dance_state_t * state, void * user_data) {
+ if (state -> count == 1 || keymap_config.no_gui) {
+ register_code16(KC_LSFT);
+ } else {
+ register_code(KC_CAPS);
+ }
+}
+
+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);
+ } else {
+ unregister_code(KC_CAPS);
+ unregister_code16(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),
+};
+#endif // TD_LSFT_CAPSLOCK_ENABLE
+
+// RGB NIGHT MODE
+#ifdef RGB_MATRIX_ENABLE
+static bool rgb_nightmode = false;
+
+// Turn on/off NUM LOCK if current state is different
+void activate_rgb_nightmode(bool turn_on) {
+ if (rgb_nightmode != turn_on) {
+ rgb_nightmode = !rgb_nightmode;
+ }
+}
+
+bool get_rgb_nightmode(void) {
+ return rgb_nightmode;
+}
+#endif // RGB_MATRIX_ENABLE
+
+// TIMEOUTS
+#ifdef IDLE_TIMEOUT_ENABLE
+static uint16_t timeout_timer = 0;
+static uint16_t timeout_counter = 0; //in minute intervals
+static uint16_t timeout_threshold = TIMEOUT_THRESHOLD_DEFAULT;
+
+uint16_t get_timeout_threshold(void) {
+ return timeout_threshold;
+}
+
+void timeout_reset_timer(void) {
+ timeout_timer = timer_read();
+ timeout_counter = 0;
+};
+
+void timeout_update_threshold(bool increase) {
+ if (increase && timeout_threshold < TIMEOUT_THRESHOLD_MAX) timeout_threshold++;
+ if (!increase && timeout_threshold > 0) timeout_threshold--;
+};
+
+void timeout_tick_timer(void) {
+ if (timeout_threshold > 0) {
+ if (timer_elapsed(timeout_timer) >= 60000) { // 1 minute tick
+ timeout_counter++;
+ timeout_timer = timer_read();
+ }
+ #ifdef RGB_MATRIX_ENABLE
+ if (timeout_threshold > 0 && timeout_counter >= timeout_threshold) {
+ rgb_matrix_disable_noeeprom();
+ }
+ #endif
+ } // timeout_threshold = 0 will disable timeout
+}
+
+#endif // IDLE_TIMEOUT_ENABLE
+
+#if defined(ALTTAB_SCROLL_ENABLE) || defined(IDLE_TIMEOUT_ENABLE) // timer features
+__attribute__((weak)) void matrix_scan_keymap(void) {}
+
+void matrix_scan_user(void) {
+ #ifdef ALTTAB_SCROLL_ENABLE
+ encoder_tick_alttabscroll();
+ #endif
+ #ifdef IDLE_TIMEOUT_ENABLE
+ timeout_tick_timer();
+ #endif
+ matrix_scan_keymap();
+}
+#endif // ALTTAB_SCROLL_ENABLE or IDLE_TIMEOUT_ENABLE
+
+// Initialize variable holding the binary representation of active modifiers.
+uint8_t mod_state;
+
+// ============================================= PROCESS KEY CODES =============================================
+
+__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t * record) {
+ return true;
+}
+
+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;
+ }
+
+ // Your macros ...
+ switch (keycode) {
+
+ // DotCom domain macros
+ case DOTCOM:
+ if (record -> event.pressed) {
+ SEND_STRING(".com");
+ } else {
+ // when keycode is released
+ }
+ break;
+ case YAHOO:
+ if (record -> event.pressed) {
+ SEND_STRING("yahoo.com");
+ } else {
+ // when keycode is released
+ }
+ break;
+ case OUTLOOK:
+ if (record -> event.pressed) {
+ SEND_STRING("outlook.com");
+ } else {
+ // when keycode is released
+ }
+ break;
+ case GMAIL:
+ if (record -> event.pressed) {
+ SEND_STRING("gmail.com");
+ } else {
+ // when keycode is released
+ }
+ break;
+ case HOTMAIL:
+ if (record -> event.pressed) {
+ SEND_STRING("hotmail.com");
+ } else {
+ // when keycode is released
+ }
+ break;
+
+/*
+ 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:
+ if (record -> event.pressed) {
+ keymap_config.no_gui = !keymap_config.no_gui; //toggle status
+ } else unregister_code16(keycode);
+ break;
+
+ // Double Zero
+ case KC_00:
+ if (record -> event.pressed) {
+ // when keycode KC_00 is pressed
+ 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;
+ }
+ }
+ }
+ break;
+
+ // Add 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;
+ }
+ }
+ }
+ break;
+
+ /* Add INS as SHIFT-modified DEL key
+ case KC_DEL: {
+ // Initialize a boolean variable that keeps track of the delete key status: registered or not?
+ static bool inskey_registered;
+ if (record->event.pressed) {
+ // Detect the activation of either shift keys
+ if (mod_state & MOD_MASK_SHIFT) {
+ // First temporarily canceling both shifts so that
+ // shift isn't applied to the KC_INS keycode
+ del_mods(MOD_MASK_SHIFT);
+ register_code(KC_INS);
+ // Update the boolean variable to reflect the status of KC_INS
+ inskey_registered = true;
+ // Reapplying modifier state so that the held shift key(s)
+ // still work even after having tapped the Delete/Insert key.
+ set_mods(mod_state);
+ return false;
+ }
+ } else { // on release of KC_DEL
+ // In case KC_INS is still being sent even after the release of KC_DEL
+ if (inskey_registered) {
+ unregister_code(KC_INS);
+ inskey_registered = false;
+ return false;
+ }
+ }
+ }
+ break;
+ */
+
+ #ifdef IDLE_TIMEOUT_ENABLE
+ case RGB_TOI:
+ if (record -> event.pressed) {
+ timeout_update_threshold(true);
+ } else unregister_code16(keycode);
+ break;
+ case RGB_TOD:
+ if (record -> event.pressed) {
+ timeout_update_threshold(false); //decrease timeout
+ } else unregister_code16(keycode);
+ break;
+ #endif // IDLE_TIMEOUT_ENABLE
+ #ifdef RGB_MATRIX_ENABLE
+ case RGB_NITE:
+ if (record -> event.pressed) {
+ rgb_nightmode = !rgb_nightmode;
+ } else unregister_code16(keycode);
+ break;
+ #endif // RGB_MATRIX_ENABLE
+
+ #ifdef EMOTICON_ENABLE
+ case EMO_SHRUG:
+ if (record -> event.pressed) SEND_STRING("`\\_(\"/)_/`");
+ else unregister_code16(keycode);
+ break;
+ case EMO_CONFUSE:
+ if (record -> event.pressed) SEND_STRING("(*_*)");
+ else unregister_code16(keycode);
+ break;
+ case EMO_TEARS:
+ if (record -> event.pressed) SEND_STRING("(T_T)");
+ else unregister_code16(keycode);
+ break;
+ case EMO_NERVOUS:
+ if (record -> event.pressed) SEND_STRING("(~_~;)");
+ else unregister_code16(keycode);
+ break;
+ case EMO_JOY:
+ if (record -> event.pressed) SEND_STRING("(^o^)");
+ else unregister_code16(keycode);
+ break;
+ case EMO_SAD:
+ if (record -> event.pressed) SEND_STRING(":'-(");
+ else unregister_code16(keycode);
+ break;
+ #endif // EMOTICON_ENABLE
+
+ #ifdef ALTTAB_SCROLL_ENABLE
+ case KC_TSTOG:
+ if (record -> event.pressed) encoder_toggle_alttabscroll();
+ else unregister_code16(keycode);
+ break;
+ #endif // ALTTAB_SCROLL_ENABLE
+
+ default:
+ if (record -> event.pressed) {
+ #ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_enable();
+ #endif
+ #ifdef IDLE_TIMEOUT_ENABLE
+ timeout_reset_timer(); //reset activity timer
+ #endif
+ }
+ break;
+ }
+ return true;
+};
+
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t * record) {
+ switch (keycode) {
+ case KC_SFTUP:
+ return 300;
+ case KC_RAISESPC:
+ case KC_LOWERSPC:
+ return 450;
+ default:
+ return TAPPING_TERM;
+ }
+}
+
+// Turn on/off NUM LOCK if current state is different
+void activate_numlock(bool turn_on) {
+ if (IS_HOST_LED_ON(USB_LED_NUM_LOCK) != turn_on) {
+ tap_code(KC_NUMLOCK);
+ }
+}
+
+// INITIAL STARTUP
+
+__attribute__((weak)) void keyboard_post_init_keymap(void) {}
+
+void keyboard_post_init_user(void) {
+ 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
+ #ifdef IDLE_TIMEOUT_ENABLE
+ timeout_timer = timer_read(); // set inital time for ide timeout
+ #endif
+} \ No newline at end of file
diff --git a/users/gourdo1/gourdo1.h b/users/gourdo1/gourdo1.h
new file mode 100644
index 0000000000..c6861ca0ca
--- /dev/null
+++ b/users/gourdo1/gourdo1.h
@@ -0,0 +1,131 @@
+/* Copyright 2021 Jonavin Eng @Jonavin
+ Copyright 2022 gourdo1 <jcblake@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
+
+// DEFINE MACROS
+#define ARRAYSIZE(arr) sizeof(arr) / sizeof(arr[0])
+
+// LAYERS
+enum custom_user_layers {
+ _BASE,
+ _FN1,
+ _NUMPADMOUSE,
+ _MOUSEKEY,
+};
+
+#define KC_CAD LALT(LCTL(KC_DEL))
+#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
+
+// KEYCODES
+enum custom_user_keycodes {
+ KC_00 = SAFE_RANGE,
+ ENCFUNC,
+ KC_WINLCK, // Toggles Win 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
+
+ YAHOO, // yahoo.com
+ OUTLOOK, // outlook.com
+ GMAIL, // gmail.com
+ HOTMAIL, // hotmail.com
+ DOTCOM, // .com
+
+ EMO_SHRUG, // `\_("/)_/`
+ EMO_CONFUSE, // (*_*)
+ EMO_SAD, // :'-(
+ EMO_NERVOUS, // (~_~;)
+ EMO_JOY, // (^o^)
+ EMO_TEARS, // (T_T)
+
+ KC_TSTOG, // Tab Scroll Toggle
+
+ 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
+
+// ENCODER ACTIONS
+#ifdef ENCODER_ENABLE
+void encoder_action_volume(bool clockwise);
+void encoder_action_mediatrack(bool clockwise);
+void encoder_action_navword(bool clockwise);
+void encoder_action_navpage(bool clockwise);
+
+uint8_t get_selected_layer(void);
+void encoder_action_layerchange(bool clockwise);
+
+#if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE)
+void encoder_action_rgb_speed(bool clockwise);
+void encoder_action_rgb_hue(bool clockwise);
+void encoder_action_rgb_saturation(bool clockwise);
+void encoder_action_rgb_brightness(bool clockwise);
+void encoder_action_rgb_mode(bool clockwise);
+#endif // RGB_MATRIX_ENABLE / RGBLIGHT_ENABLE
+
+#ifdef ALTTAB_SCROLL_ENABLE
+void encoder_action_alttabscroll(bool clockwise);
+void encoder_toggle_alttabscroll(void);
+void encoder_tick_alttabscroll(void);
+#endif // ALTTAB_SCROLL_ENABLE
+#endif // ENCODER_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+void activate_rgb_nightmode(bool turn_on);
+bool get_rgb_nightmode(void);
+#endif
+
+// IDLE TIMEOUTS
+#ifdef IDLE_TIMEOUT_ENABLE
+#define TIMEOUT_THRESHOLD_DEFAULT 15 // default timeout minutes
+#define TIMEOUT_THRESHOLD_MAX 140 // upper limits (2 hours and 10 minutes -- no rgb indicators above this value)
+
+//prototype functions
+uint16_t get_timeout_threshold(void);
+void timeout_reset_timer(void);
+void timeout_update_threshold(bool increase);
+void timeout_tick_timer(void);
+#endif //IDLE_TIMEOUT_ENABLE
+
+// OTHER FUNCTION PROTOTYPE
+void activate_numlock(bool turn_on); \ No newline at end of file
diff --git a/users/gourdo1/gourdo1_encoder.c b/users/gourdo1/gourdo1_encoder.c
new file mode 100644
index 0000000000..72f8c3c354
--- /dev/null
+++ b/users/gourdo1/gourdo1_encoder.c
@@ -0,0 +1,238 @@
+/* Copyright 2021 Jonavin Eng @Jonavin
+ Copyright 2022 gourdo1 <jcblake@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/>.
+*/
+
+
+#include QMK_KEYBOARD_H
+#include "gourdo1.h"
+
+#ifdef ENCODER_ENABLE
+ #ifndef DYNAMIC_KEYMAP_LAYER_COUNT
+ #define DYNAMIC_KEYMAP_LAYER_COUNT 4 //default in case this is not already defined elsewhere
+ #endif
+ #ifndef ENCODER_DEFAULTACTIONS_INDEX
+ #define ENCODER_DEFAULTACTIONS_INDEX 0 // can select encoder index if there are multiple encoders
+ #endif
+
+ static uint16_t key_timer;
+
+ void encoder_action_volume(bool clockwise) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ if (timer_elapsed(key_timer) < 50) {
+ tap_code(KC_VOLU); // if less than 50ms have passed, hit vol up again.
+ key_timer = timer_read();
+ } else {
+ key_timer = timer_read();
+ // do nothing if 50ms or more have passed
+ }
+ }
+ else {
+ tap_code(KC_VOLD);
+ if (timer_elapsed(key_timer) < 100) {
+ tap_code(KC_VOLD); // if less than 100ms have passed, hit vol down twice.
+ tap_code(KC_VOLD);
+ key_timer = timer_read();
+ } else {
+ key_timer = timer_read();
+ // do nothing if 100ms or more have passed
+ }
+ }
+ }
+
+ void encoder_action_mediatrack(bool clockwise) {
+ if (clockwise)
+ tap_code(KC_MEDIA_NEXT_TRACK);
+ else
+ tap_code(KC_MEDIA_PREV_TRACK);
+ }
+
+ void encoder_action_navword(bool clockwise) {
+ if (clockwise)
+ tap_code16(LCTL(KC_RGHT));
+ else
+ tap_code16(LCTL(KC_LEFT));
+ }
+
+ void encoder_action_navpage(bool clockwise) {
+ if (clockwise)
+ tap_code16(KC_PGUP);
+ else
+ tap_code16(KC_PGDN);
+ }
+
+ // LAYER HANDLING
+ uint8_t selected_layer = 0;
+
+ uint8_t get_selected_layer(void) {
+ return selected_layer;
+ }
+
+ void encoder_action_layerchange(bool clockwise) {
+ if (clockwise) {
+ if(selected_layer < (DYNAMIC_KEYMAP_LAYER_COUNT - 1)) {
+ selected_layer ++;
+ layer_move(selected_layer);
+ }
+ } else {
+ if (selected_layer > 0) {
+ selected_layer --;
+ layer_move(selected_layer);
+ }
+ }
+ }
+
+ #ifdef RGB_MATRIX_ENABLE
+ void encoder_action_rgb_speed(bool clockwise) {
+ if (clockwise)
+ rgb_matrix_increase_speed_noeeprom();
+ else
+ rgb_matrix_decrease_speed_noeeprom();
+ }
+ void encoder_action_rgb_hue(bool clockwise) {
+ if (clockwise)
+ rgb_matrix_increase_hue_noeeprom();
+ else
+ rgb_matrix_decrease_hue_noeeprom();
+ }
+ void encoder_action_rgb_saturation(bool clockwise) {
+ if (clockwise)
+ rgb_matrix_increase_sat_noeeprom();
+ else
+ rgb_matrix_decrease_sat_noeeprom();
+ }
+ void encoder_action_rgb_brightness(bool clockwise) {
+ if (clockwise)
+ rgb_matrix_increase_val_noeeprom();
+ else
+ rgb_matrix_decrease_val_noeeprom();
+ }
+ void encoder_action_rgb_mode(bool clockwise) {
+ if (clockwise)
+ rgb_matrix_step_noeeprom();
+ else
+ rgb_matrix_step_reverse_noeeprom();
+ }
+ #elif defined(RGBLIGHT_ENABLE)
+ void encoder_action_rgb_speed(bool clockwise) {
+ if (clockwise)
+ rgblight_increase_speed_noeeprom();
+ else
+ rgblight_decrease_speed_noeeprom();
+ }
+ void encoder_action_rgb_hue(bool clockwise) {
+ if (clockwise)
+ rgblight_increase_hue_noeeprom();
+ else
+ rgblight_decrease_hue_noeeprom();
+ }
+ void encoder_action_rgb_saturation(bool clockwise) {
+ if (clockwise)
+ rgblight_increase_sat_noeeprom();
+ else
+ rgblight_decrease_sat_noeeprom();
+ }
+ void encoder_action_rgb_brightness(bool clockwise) {
+ if (clockwise)
+ rgblight_increase_val_noeeprom();
+ else
+ rgblight_decrease_val_noeeprom();
+ }
+ void encoder_action_rgb_mode(bool clockwise) {
+ if (clockwise)
+ rgblight_step_noeeprom();
+ else
+ rgblight_step_reverse_noeeprom();
+ }
+ #endif // RGB_MATRIX_ENABLE || RGBLIGHT_ENABLE
+
+ #ifdef ALTTAB_SCROLL_ENABLE
+ bool is_tab_scrolling = false;
+ bool is_alt_tab_active = false;
+ uint16_t alt_tab_timer = 0;
+
+
+ void encoder_toggle_alttabscroll(void) {
+ is_tab_scrolling = !is_tab_scrolling;
+ }
+
+ void encoder_action_alttabscroll(bool clockwise) {
+ if (clockwise) {
+ if (!is_alt_tab_active) {
+ is_alt_tab_active = true;
+ register_mods(MOD_RALT);
+ }
+ tap_code16(KC_TAB);
+ }
+ else {
+ tap_code16(S(KC_TAB));
+ }
+ alt_tab_timer = timer_read();
+ }
+
+ void encoder_tick_alttabscroll(void) {
+ if (is_alt_tab_active) {
+ if (timer_elapsed(alt_tab_timer) > 600) {
+ unregister_mods(MOD_RALT);
+ is_alt_tab_active = false;
+ }
+ }
+ }
+ #endif // ALTTAB_SCROLL_ENABLE
+#endif // ENCODER_ENABLE
+
+#if defined(ENCODER_ENABLE) && defined(ENCODER_DEFAULTACTIONS_ENABLE) // Encoder Functionality
+
+ __attribute__((weak)) bool encoder_update_keymap(uint8_t index, bool clockwise) { return true; }
+
+ bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (!encoder_update_keymap(index, clockwise)) { return false; }
+ if (index != ENCODER_DEFAULTACTIONS_INDEX) {return true;} // exit if the index doesn't match
+ 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_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;
+ default:
+ #ifdef ALTTAB_SCROLL_ENABLE
+ if (is_tab_scrolling)
+ encoder_action_alttabscroll(clockwise);
+ else
+ encoder_action_volume(clockwise); // Otherwise it just changes volume
+ #else
+ encoder_action_volume(clockwise); // Otherwise it just changes volume
+ #endif // ALTTAB_SCROLL_ENABLE
+ break;
+ }
+ }
+ return false;
+ }
+#endif // ENCODER_ENABLE
+
+
diff --git a/users/gourdo1/rules.mk b/users/gourdo1/rules.mk
new file mode 100644
index 0000000000..e02f9e8e08
--- /dev/null
+++ b/users/gourdo1/rules.mk
@@ -0,0 +1,29 @@
+SRC += gourdo1.c
+ifdef ENCODER_ENABLE
+ # include encoder related code when enabled
+ ifeq ($(strip $(ENCODER_DEFAULTACTIONS_ENABLE)), yes)
+ OPT_DEFS += -DENCODER_DEFAULTACTIONS_ENABLE
+ endif
+ ifeq ($(strip $(ALTTAB_SCROLL_ENABLE)), yes)
+ OPT_DEFS += -DALTTAB_SCROLL_ENABLE
+ endif
+ SRC += gourdo1_encoder.c
+endif
+ifeq ($(strip $(TD_LSFT_CAPSLOCK_ENABLE)), yes)
+ OPT_DEFS += -DTD_LSFT_CAPSLOCK_ENABLE
+endif
+ifeq ($(strip $(IDLE_TIMEOUT_ENABLE)), yes)
+ OPT_DEFS += -DIDLE_TIMEOUT_ENABLE
+endif
+ifeq ($(strip $(STARTUP_NUMLOCK_ON)), yes)
+ OPT_DEFS += -DSTARTUP_NUMLOCK_ON
+endif
+ifeq ($(strip $(COLEMAK_LAYER_ENABLE)), yes)
+ OPT_DEFS += -DCOLEMAK_LAYER_ENABLE
+endif
+ifeq ($(strip $(EMOTICON_ENABLE)), yes)
+ OPT_DEFS += -DEMOTICON_ENABLE
+endif
+ifeq ($(strip $(INVERT_NUMLOCK_INDICATOR)), yes)
+ OPT_DEFS += -DINVERT_NUMLOCK_INDICATOR
+endif