summary refs log tree commit diff
diff options
context:
space:
mode:
authorjonavin <71780717+Jonavin@users.noreply.github.com>2021-09-28 15:24:12 -0400
committerGitHub <noreply@github.com>2021-09-28 12:24:12 -0700
commit705cd433c22aad00b12183eaa3bada50d90fd97b (patch)
treed529e7d14aca455a8ed494f00ebe4707dac40af6
parent724ee240751fdfedf33d75fee10d2b97d9f9e3da (diff)
[Keymap] fix NKRO - switch to get_mods() and refactor encoder action code (#14278)
Co-authored-by: Jonavin <=>
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/jonavin/keymap.c37
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/jonavin/readme.md1
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/jonavin/rules.mk2
-rw-r--r--keyboards/keebio/quefrency/keymaps/jonavin/keymap.c55
-rwxr-xr-xkeyboards/mechwild/mercutio/keymaps/jonavin/keymap.c75
-rw-r--r--keyboards/mechwild/murphpad/keymaps/jonavin/keymap.c89
-rw-r--r--users/jonavin/jonavin.c129
-rw-r--r--users/jonavin/jonavin.h12
-rw-r--r--users/jonavin/readme.md3
9 files changed, 213 insertions, 190 deletions
diff --git a/keyboards/gmmk/pro/ansi/keymaps/jonavin/keymap.c b/keyboards/gmmk/pro/ansi/keymaps/jonavin/keymap.c
index 20a786feb7..f37abfac30 100644
--- a/keyboards/gmmk/pro/ansi/keymaps/jonavin/keymap.c
+++ b/keyboards/gmmk/pro/ansi/keymaps/jonavin/keymap.c
@@ -78,6 +78,43 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 #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;
+    }
+#endif // ENCODER_ENABLE && !ENCODER_DEFAULTACTIONS_ENABLE
 
 #ifdef RGB_MATRIX_ENABLE
     // Capslock, Scroll lock and Numlock  indicator on Left side lights.
diff --git a/keyboards/gmmk/pro/ansi/keymaps/jonavin/readme.md b/keyboards/gmmk/pro/ansi/keymaps/jonavin/readme.md
index a6482baa56..2aa910e0c7 100644
--- a/keyboards/gmmk/pro/ansi/keymaps/jonavin/readme.md
+++ b/keyboards/gmmk/pro/ansi/keymaps/jonavin/readme.md
@@ -12,6 +12,7 @@
     - holding Left shift, change layers
     - holding right shift, Navigate page up/down
     - holding Left Ctrl, navigate prev/next word
+    - holding Right Ctrl, changes RGB hue/colour
     - holding Left Alt, change media prev/next track
     - default is change volume
     
diff --git a/keyboards/gmmk/pro/ansi/keymaps/jonavin/rules.mk b/keyboards/gmmk/pro/ansi/keymaps/jonavin/rules.mk
index b06ae1b6ad..81b84eea7f 100644
--- a/keyboards/gmmk/pro/ansi/keymaps/jonavin/rules.mk
+++ b/keyboards/gmmk/pro/ansi/keymaps/jonavin/rules.mk
@@ -6,6 +6,6 @@ BOOTMAGIC_ENABLE = lite     # Enable Bootmagic Lite
 TD_LSFT_CAPSLOCK_ENABLE = yes
 IDLE_TIMEOUT_ENABLE = yes
 STARTUP_NUMLOCK_ON = yes
-ENCODER_DEFAULTACTIONS_ENABLE = yes
+ENCODER_DEFAULTACTIONS_ENABLE = no
 
 COLEMAK_LAYER_ENABLE = yes  #Enable Colemak layer / set to no to disable
diff --git a/keyboards/keebio/quefrency/keymaps/jonavin/keymap.c b/keyboards/keebio/quefrency/keymaps/jonavin/keymap.c
index 721148f4dc..415f554e26 100644
--- a/keyboards/keebio/quefrency/keymaps/jonavin/keymap.c
+++ b/keyboards/keebio/quefrency/keymaps/jonavin/keymap.c
@@ -57,46 +57,31 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 };
 
 #ifdef ENCODER_ENABLE       // Encoder Functionality
-bool encoder_update_user(uint8_t index, bool clockwise) {
-    switch (index)
-    {
-    case 0:  // first encoder (Left Macro set)
-            if (clockwise) {
-            tap_code(KC_PGDN);
-        }  else {
-            tap_code(KC_PGUP);
-        }
+    bool encoder_update_user(uint8_t index, bool clockwise) {
+        uint8_t mods_state = get_mods();
+        switch (index) {
+        case 0:  // first encoder (Left Macro set)
+            encoder_action_navpage(clockwise);
+            break;
 
-    default: // other encoder (Top right)
-        if ( clockwise ) {
-            if (keyboard_report->mods & MOD_BIT(KC_LSFT) ) { // If you are holding L shift, Page up
-                unregister_mods(MOD_BIT(KC_LSFT));
-                register_code(KC_PGDN);
-                register_mods(MOD_BIT(KC_LSFT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LCTL)) {  // if holding Left Ctrl, navigate next word
-                    tap_code16(LCTL(KC_RGHT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LALT)) {  // if holding Left Alt, change media next track
-                tap_code(KC_MEDIA_NEXT_TRACK);
+        default: // other encoder (Top right)
+            if (mods_state & MOD_BIT(KC_LSFT) ) { // If you are holding Left shift, change layers
+                encoder_action_layerchange(clockwise);
+            } else if (mods_state & MOD_BIT(KC_RSFT) ) { // If you are holding Right shift, Page up
+                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  {
-                tap_code(KC_VOLU);                                                   // Otherwise it just changes volume
-            }
-        } else {
-            if (keyboard_report->mods & MOD_BIT(KC_LSFT) ) {
-                unregister_mods(MOD_BIT(KC_LSFT));
-                register_code(KC_PGUP);
-                register_mods(MOD_BIT(KC_LSFT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LCTL)) {  // if holding Left Ctrl, navigate previous word
-                tap_code16(LCTL(KC_LEFT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LALT)) {  // if holding Left Alt, change media previous track
-                tap_code(KC_MEDIA_PREV_TRACK);
-            } else {
-                tap_code(KC_VOLD);
+                encoder_action_volume(clockwise);     // Otherwise it just changes volume
             }
+            break;
         }
-        break;
+        return true;
     }
-    return true;
-}
 #endif
 
 #ifdef RGBLIGHT_ENABLE
diff --git a/keyboards/mechwild/mercutio/keymaps/jonavin/keymap.c b/keyboards/mechwild/mercutio/keymaps/jonavin/keymap.c
index 74811cbc35..22d26db3c2 100755
--- a/keyboards/mechwild/mercutio/keymaps/jonavin/keymap.c
+++ b/keyboards/mechwild/mercutio/keymaps/jonavin/keymap.c
@@ -106,63 +106,48 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 
 
 #ifdef ENCODER_ENABLE       // Encoder Functionality
-    uint8_t selected_layer = 0;
+    void encoder_action_selectkey(bool clockwise) {
+        if ( clockwise ) {
+            if ( selectedkey_idx  < MAX_KEYSELECTION-1) {
+                selectedkey_idx ++;
+            } else {
+                // do nothing
+            }
+        } else if ( !clockwise ) {
+            if ( selectedkey_idx  > 0){
+                selectedkey_idx --;
+            } else {
+                // do nothing
+            }
+        }
+        set_selectedkey(selectedkey_idx);
+    }
 
     bool encoder_update_user(uint8_t index, bool clockwise) {
         #ifdef OLED_ENABLE
             oled_clear();
             oled_render();
         #endif
+        uint8_t mods_state = get_mods();
         switch (index) {
             case 0:         // This is the only encoder right now, keeping for consistency
                 switch(get_highest_layer(layer_state)){  // special handling per layer
                 case _FN1:  // on Fn layer select what the encoder does when pressed
-                    if (!keyboard_report->mods) {
-                        if ( clockwise ) {
-                            if ( selectedkey_idx  < MAX_KEYSELECTION-1) {
-                                selectedkey_idx ++;
-                            } else {
-                               // do nothing
-                            }
-                        } else if ( !clockwise ) {
-                            if ( selectedkey_idx  > 0){
-                                selectedkey_idx --;
-                            } else {
-                                // do nothing
-                            }
-                        }
-                        set_selectedkey(selectedkey_idx);
+                    if (!mods_state) {
+                        encoder_action_selectkey(clockwise);
                         break;
                     } else {
                            // continue to default
                     }
                 default:   // all other layers
-                    if ( clockwise ) {
-                        if (keyboard_report->mods & MOD_BIT(KC_LSFT) ) { // If you are holding L shift, encoder changes layers
-                            if(selected_layer  < 3) {
-                                selected_layer ++;
-                                layer_move(selected_layer);
-                            }
-                        } else if (keyboard_report->mods & MOD_BIT(KC_LCTL)) {  // if holding Left Ctrl, navigate next word
-                             tap_code16(LCTL(KC_RGHT));
-                        } else if (keyboard_report->mods & MOD_BIT(KC_LALT)) {  // if holding Left Alt, change media next track
-                            tap_code(KC_MEDIA_NEXT_TRACK);
-                        } else  {
-                            tap_code(KC_VOLU);                                                   // Otherwise it just changes volume
-                        }
-                    } else if ( !clockwise ) {
-                        if (keyboard_report->mods & MOD_BIT(KC_LSFT) ) {
-                            if (selected_layer  > 0) {
-                                selected_layer --;
-                                layer_move(selected_layer);
-                            }
-                        } else if (keyboard_report->mods & MOD_BIT(KC_LCTL)) {  // if holding Left Ctrl, navigate previous word
-                            tap_code16(LCTL(KC_LEFT));
-                        } else if (keyboard_report->mods & MOD_BIT(KC_LALT)) {  // if holding Left Alt, change media previous track
-                            tap_code(KC_MEDIA_PREV_TRACK);
-                        } else {
-                            tap_code(KC_VOLD);
-                        }
+                    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_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  {
+                        encoder_action_volume(clockwise);   // Otherwise it just changes volume
                     }
                     break;
                 }
@@ -205,7 +190,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 
     void oled_task_user(void) {
 
-        if ( IS_HOST_LED_OFF(USB_LED_NUM_LOCK) && IS_HOST_LED_OFF(USB_LED_CAPS_LOCK) && selected_layer == 0 && get_highest_layer(layer_state) == 0 ) {
+        if ( IS_HOST_LED_OFF(USB_LED_NUM_LOCK) && IS_HOST_LED_OFF(USB_LED_CAPS_LOCK) && get_selected_layer() == 0 && get_highest_layer(layer_state) == 0 ) {
             render_name();
             clear_screen = true;
         } else {
@@ -217,7 +202,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
             render_logo();
             oled_set_cursor(8,2);
             char fn_str[12];
-            switch(selected_layer){
+            switch(get_selected_layer()){
                 case 0:
                     oled_write_P(PSTR("BASE"), false);
                     break;
@@ -237,7 +222,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
             }
             oled_write_P(keymap_config.no_gui ? PSTR(" WL") : PSTR("   "), false);
             oled_set_cursor(8,3);
-            if (get_highest_layer(layer_state) == selected_layer) {
+            if (get_highest_layer(layer_state) == get_selected_layer()) {
                 oled_write_P(PSTR("             "), false);
             } else {
                 switch (get_highest_layer(layer_state)) {
diff --git a/keyboards/mechwild/murphpad/keymaps/jonavin/keymap.c b/keyboards/mechwild/murphpad/keymaps/jonavin/keymap.c
index 001abc5027..39e6ac87e4 100644
--- a/keyboards/mechwild/murphpad/keymaps/jonavin/keymap.c
+++ b/keyboards/mechwild/murphpad/keymaps/jonavin/keymap.c
@@ -144,67 +144,52 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 
 
 #ifdef ENCODER_ENABLE       // Encoder Functionality
-    uint8_t selected_layer = 0;
+    void encoder_action_selectkey(bool clockwise) {
+        if ( clockwise ) {
+            if ( selectedkey_idx  < MAX_KEYSELECTION-1) {
+                selectedkey_idx ++;
+            } else {
+                // do nothing
+            }
+        } else if ( !clockwise ) {
+            if ( selectedkey_idx  > 0){
+                selectedkey_idx --;
+            } else {
+                // do nothing
+            }
+        }
+        set_selectedkey(selectedkey_idx);
+    }
 
     bool encoder_update_user(uint8_t index, bool clockwise) {
         #ifdef OLED_ENABLE
             oled_clear();
             oled_render();
         #endif
+        uint8_t mods_state = get_mods();
         switch (index) {
             case 0:         // This is the only encoder right now, keeping for consistency
-                switch(get_highest_layer(layer_state)){  // special handling per layer
-                case _FN1:  // on Fn layer select what the encoder does when pressed
-                    if (!keyboard_report->mods) {
-                        if ( clockwise ) {
-                            if ( selectedkey_idx  < MAX_KEYSELECTION-1) {
-                                selectedkey_idx ++;
-                            } else {
-                               // do nothing
-                            }
-                        } else if ( !clockwise ) {
-                            if ( selectedkey_idx  > 0){
-                                selectedkey_idx --;
-                            } else {
-                                // do nothing
-                            }
-                        }
-                        set_selectedkey(selectedkey_idx);
-                        break;
-                    } else {
-                           // continue to default
-                    }
-                default:   // all other layers
-                    if ( clockwise ) {
-                        if (keyboard_report->mods & MOD_BIT(KC_RSFT) ) { // If you are holding Right Shift, encoder changes layers
-                            if(selected_layer  < (DYNAMIC_KEYMAP_LAYER_COUNT-1)) {
-                                selected_layer ++;
-                                layer_move(selected_layer);
-                            }
-                        } else if (keyboard_report->mods & MOD_BIT(KC_RCTL)) {  // if holding Right Ctrl, navigate next word
-                             tap_code16(LCTL(KC_RGHT));
-                        } else if (keyboard_report->mods & MOD_BIT(KC_RALT)) {  // if holding Right Alt, change media next track
-                            tap_code(KC_MEDIA_NEXT_TRACK);
-                        } else  {
-                            tap_code(KC_VOLU);                                                   // Otherwise it just changes volume
-                        }
-                    } else if ( !clockwise ) {
-                        if (keyboard_report->mods & MOD_BIT(KC_RSFT) ) {
-                            if (selected_layer  > 0) {
-                                selected_layer --;
-                                layer_move(selected_layer);
-                            }
-                        } else if (keyboard_report->mods & MOD_BIT(KC_RCTL)) {  // if holding Right Ctrl, navigate previous word
-                            tap_code16(LCTL(KC_LEFT));
-                        } else if (keyboard_report->mods & MOD_BIT(KC_RALT)) {  // if holding Right Alt, change media previous track
-                            tap_code(KC_MEDIA_PREV_TRACK);
-                        } else {
-                            tap_code(KC_VOLD);
-                        }
-                    }
+            switch(get_highest_layer(layer_state)){  // special handling per layer
+            case _FN1:  // on Fn layer select what the encoder does when pressed
+                if (!mods_state) {
+                    encoder_action_selectkey(clockwise);
                     break;
+                } else {
+                        // continue to default
+                }
+            default:   // all other layers
+                if (mods_state & MOD_BIT(KC_RSFT) ) { // If you are holding R shift, encoder changes layers
+                    encoder_action_layerchange(clockwise);
+                } else if (mods_state & MOD_BIT(KC_RCTL)) {  // if holding Right Ctrl, navigate next/prev word
+                    encoder_action_navword(clockwise);
+                } else if (mods_state & MOD_BIT(KC_RALT)) {  // if holding Right Alt, change media next/prev track
+                    encoder_action_mediatrack(clockwise);
+                } else  {
+                    encoder_action_volume(clockwise);   // Otherwise it just changes volume
                 }
                 break;
+            }
+            break;
         }
         return true;
     }
@@ -232,7 +217,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 
         render_logo();
         oled_set_cursor(8,2);
-        switch(selected_layer){
+        switch(get_selected_layer()){
             case _BASE:
                 oled_write_P(PSTR("BASE"), false);
                 break;
@@ -257,7 +242,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
         }
         oled_write_P(keymap_config.no_gui ? PSTR(" WL") : PSTR("   "), false);
         oled_set_cursor(8,3);
-        if (get_highest_layer(layer_state) == selected_layer) {
+        if (get_highest_layer(layer_state) == get_selected_layer()) {
             oled_write_P(PSTR("             "), false);
         } else {
             switch (get_highest_layer(layer_state)) {
diff --git a/users/jonavin/jonavin.c b/users/jonavin/jonavin.c
index bd6c55e9fe..6ecadc7b47 100644
--- a/users/jonavin/jonavin.c
+++ b/users/jonavin/jonavin.c
@@ -104,7 +104,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #endif // IDLE_TIMEOUT_ENABLE
 
 
-#if defined(ENCODER_ENABLE) && defined(ENCODER_DEFAULTACTIONS_ENABLE)       // Encoder Functionality
+#ifdef ENCODER_ENABLE
     #ifndef DYNAMIC_KEYMAP_LAYER_COUNT
         #define DYNAMIC_KEYMAP_LAYER_COUNT 4  //default in case this is not already defined elsewhere
     #endif
@@ -112,67 +112,86 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
         #define ENCODER_DEFAULTACTIONS_INDEX 0  // can select encoder index if there are multiple encoders
     #endif
 
-uint8_t selected_layer = 0;
+    void encoder_action_volume(bool clockwise) {
+        if (clockwise)
+            tap_code(KC_VOLU);
+        else
+            tap_code(KC_VOLD);
+    }
 
-__attribute__((weak)) bool encoder_update_keymap(uint8_t index, bool clockwise) { return true; }
+    void encoder_action_mediatrack(bool clockwise) {
+        if (clockwise)
+            tap_code(KC_MEDIA_NEXT_TRACK);
+        else
+            tap_code(KC_MEDIA_PREV_TRACK);
+    }
 
-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
-        if ( clockwise ) {
-            if (keyboard_report->mods & MOD_BIT(KC_LSFT) ) { // If you are holding L shift, encoder changes layers
-                if(selected_layer  < (DYNAMIC_KEYMAP_LAYER_COUNT - 1)) {
-                    selected_layer ++;
-                    layer_move(selected_layer);
-                }
-            } else if (keyboard_report->mods & MOD_BIT(KC_RSFT) ) { // If you are holding R shift, Page up
-                unregister_mods(MOD_BIT(KC_RSFT));
-                register_code(KC_PGDN);
-                register_mods(MOD_BIT(KC_RSFT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LCTL)) {  // if holding Left Ctrl, navigate next word
-                    tap_code16(LCTL(KC_RGHT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LALT)) {  // if holding Left Alt, change media next track
-                tap_code(KC_MEDIA_NEXT_TRACK);
-            } else  {
-                switch (selected_layer) {
-                case _FN1:
-                    #ifdef IDLE_TIMEOUT_ENABLE
-                        timeout_update_threshold(true);
-                    #endif
-                    break;
-                default:
-                    tap_code(KC_VOLU);       // Otherwise it just changes volume
-                    break;
-                }
+    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 (keyboard_report->mods & MOD_BIT(KC_LSFT) ) {
-                if (selected_layer  > 0) {
-                    selected_layer --;
-                    layer_move(selected_layer);
-                }
-            } else if (keyboard_report->mods & MOD_BIT(KC_RSFT) ) {
-                unregister_mods(MOD_BIT(KC_RSFT));
-                register_code(KC_PGUP);
-                register_mods(MOD_BIT(KC_RSFT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LCTL)) {  // if holding Left Ctrl, navigate previous word
-                tap_code16(LCTL(KC_LEFT));
-            } else if (keyboard_report->mods & MOD_BIT(KC_LALT)) {  // if holding Left Alt, change media previous track
-                tap_code(KC_MEDIA_PREV_TRACK);
-            } else {
-                switch (selected_layer) {
-                case _FN1:
-                    #ifdef IDLE_TIMEOUT_ENABLE
-                        timeout_update_threshold(false);
-                    #endif
-                    break;
-                default:
-                    tap_code(KC_VOLD);
-                    break;
-                }
+            if (selected_layer  > 0) {
+                selected_layer --;
+                layer_move(selected_layer);
             }
         }
+    }
+#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:
+                encoder_action_volume(clockwise);       // Otherwise it just changes volume
+                break;
+            }
+        }
         return true;
     }
 #endif // ENCODER_ENABLE
diff --git a/users/jonavin/jonavin.h b/users/jonavin/jonavin.h
index 5f467bc845..316483940a 100644
--- a/users/jonavin/jonavin.h
+++ b/users/jonavin/jonavin.h
@@ -58,6 +58,18 @@ enum custom_user_keycodes {
 #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);
+#endif // ENCODER_ENABLE
+
+
 #ifdef RGB_MATRIX_ENABLE
 //RGB custom colours
     #define RGB_GODSPEED 0x00, 0xE4, 0xFF // colour for matching keycaps
diff --git a/users/jonavin/readme.md b/users/jonavin/readme.md
index 97fff6520c..c029796b4e 100644
--- a/users/jonavin/readme.md
+++ b/users/jonavin/readme.md
@@ -65,11 +65,10 @@ KEYMAP LEVEL ADDITIONAL PROCESSING FUNCTIONS
     void keyboard_post_init_keymap(void)
 
 LIST OF COMPATIBLE KEYMAPS
-    - gmmk/pro
     - gmmk/pro/ansi
     - keebio/quefrency/rev3
     - mechwild/mercutio
-    - mechwild/murphpad (*)
+    - mechwild/murphpad
     - mechwild/OBE (*)
     - nopunin10did/kastenwagen (*)