From 855c03d44565a44607d5446fbf227e6955293847 Mon Sep 17 00:00:00 2001
From: Kumiko as a Service <Dreista@users.noreply.github.com>
Date: Mon, 24 Jul 2023 23:05:17 -0400
Subject: [PATCH] Add Caps Lock indicator for Kyechron S1 white backlight
 version (#21559)

---
 keyboards/keychron/s1/ansi/white/config.h |  3 ++
 keyboards/keychron/s1/s1.c                | 50 +++++++++++++++++++++--
 2 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/keyboards/keychron/s1/ansi/white/config.h b/keyboards/keychron/s1/ansi/white/config.h
index ee09c95266..65a79726ca 100644
--- a/keyboards/keychron/s1/ansi/white/config.h
+++ b/keyboards/keychron/s1/ansi/white/config.h
@@ -31,6 +31,9 @@
 /* Disable LED lighting when PC is in suspend */
 #define LED_DISABLE_WHEN_USB_SUSPENDED
 
+/* Enable caps-lock LED */
+#define CAPS_LOCK_LED_INDEX 46
+
 // LED Matrix Animation modes. Explicitly enabled
 // For full list of effects, see:
 // https://docs.qmk.fm/#/feature_led_matrix?id=led-matrix-effects
diff --git a/keyboards/keychron/s1/s1.c b/keyboards/keychron/s1/s1.c
index 50f54b6547..d8488dd6ea 100644
--- a/keyboards/keychron/s1/s1.c
+++ b/keyboards/keychron/s1/s1.c
@@ -28,7 +28,7 @@ const matrix_row_t matrix_mask[] = {
 #ifdef DIP_SWITCH_ENABLE
 
 bool dip_switch_update_kb(uint8_t index, bool active) {
-    if (!dip_switch_update_user(index, active)) { return false;}
+    if (!dip_switch_update_user(index, active)) { return false; }
     if (index == 0) {
         default_layer_set(1UL << (active ? 2 : 0));
     }
@@ -73,10 +73,54 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
         RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 255, 255, 255);
     } else {
         if (!rgb_matrix_get_flags()) {
-           RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 0, 0, 0);
+            RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 0, 0, 0);
         }
     }
     return true;
 }
 
-#endif // CAPS_LOCK_LED_INDEX
+#endif // RGB_MATRIX_ENABLE && CAPS_LOCK_LED_INDEX
+
+#if defined(LED_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX)
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+    if (!process_record_user(keycode, record)) { return false; }
+    switch (keycode) {
+#ifdef LED_MATRIX_ENABLE
+        case BL_TOGG:
+            if (record->event.pressed) {
+                switch (led_matrix_get_flags()) {
+                    case LED_FLAG_ALL: {
+                        led_matrix_set_flags(LED_FLAG_NONE);
+                        led_matrix_set_value_all(0);
+                    } break;
+                    default: {
+                        led_matrix_set_flags(LED_FLAG_ALL);
+                    } break;
+                }
+            }
+            if (!led_matrix_is_enabled()) {
+                led_matrix_set_flags(LED_FLAG_ALL);
+                led_matrix_enable();
+            }
+            return false;
+#endif
+    }
+    return true;
+}
+
+bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) {
+    if (!led_matrix_indicators_advanced_user(led_min, led_max)) { return false; }
+
+    if (host_keyboard_led_state().caps_lock) {
+        led_matrix_set_value(CAPS_LOCK_LED_INDEX, 255);
+
+    } else {
+        if (!led_matrix_get_flags()) {
+            led_matrix_set_value(CAPS_LOCK_LED_INDEX, 0);
+        }
+    }
+    return true;
+}
+
+#endif // LED_MATRIX_ENABLE && CAPS_LOCK_LED_INDEX