浏览代码

Add mechanical locking switch support for CapsLock

tmk 12 年之前
父节点
当前提交
92b92dd78f
共有 4 个文件被更改,包括 38 次插入18 次删除
  1. 29 1
      common/action.c
  2. 1 0
      common/keyboard.c
  3. 1 0
      common/keycode.h
  4. 7 17
      keyboard/gh60/config.h

+ 29 - 1
common/action.c

@@ -23,6 +23,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "command.h"
 #include "command.h"
 #include "util.h"
 #include "util.h"
 #include "debug.h"
 #include "debug.h"
+#include "led.h"
 #include "layer_switch.h"
 #include "layer_switch.h"
 #include "action_macro.h"
 #include "action_macro.h"
 #include "action.h"
 #include "action.h"
@@ -889,6 +890,18 @@ void register_code(uint8_t code)
     if (code == KC_NO) {
     if (code == KC_NO) {
         return;
         return;
     }
     }
+#ifdef CAPSLOCK_LOCKING_ENABLE
+    else if (KC_LOCKING_CAPS == code) {
+#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE
+        // Resync: ignore if caps lock already is on
+        if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) return;
+#endif
+        host_add_key(KC_CAPSLOCK);
+        host_send_keyboard_report();
+        host_del_key(KC_CAPSLOCK);
+        host_send_keyboard_report();
+    }
+#endif
     else if IS_KEY(code) {
     else if IS_KEY(code) {
         // TODO: should push command_proc out of this block?
         // TODO: should push command_proc out of this block?
         if (command_proc(code)) return;
         if (command_proc(code)) return;
@@ -914,7 +927,22 @@ void register_code(uint8_t code)
 
 
 void unregister_code(uint8_t code)
 void unregister_code(uint8_t code)
 {
 {
-    if IS_KEY(code) {
+    if (code == KC_NO) {
+        return;
+    }
+#ifdef CAPSLOCK_LOCKING_ENABLE
+    else if (KC_LOCKING_CAPS == code) {
+#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE
+        // Resync: ignore if caps lock already is off
+        if (!(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) return;
+#endif
+        host_add_key(KC_CAPSLOCK);
+        host_send_keyboard_report();
+        host_del_key(KC_CAPSLOCK);
+        host_send_keyboard_report();
+    }
+#endif
+    else if IS_KEY(code) {
         host_del_key(code);
         host_del_key(code);
         host_send_keyboard_report();
         host_send_keyboard_report();
     }
     }

+ 1 - 0
common/keyboard.c

@@ -134,5 +134,6 @@ MATRIX_LOOP_END:
 
 
 void keyboard_set_leds(uint8_t leds)
 void keyboard_set_leds(uint8_t leds)
 {
 {
+    if (debug_keyboard) { debug("keyboard_set_led: "); debug_hex8(leds); debug("\n"); }
     led_set(leds);
     led_set(leds);
 }
 }

+ 1 - 0
common/keycode.h

@@ -81,6 +81,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define KC_APP  KC_APPLICATION
 #define KC_APP  KC_APPLICATION
 #define KC_NUHS KC_NONUS_HASH
 #define KC_NUHS KC_NONUS_HASH
 #define KC_NUBS KC_NONUS_BSLASH
 #define KC_NUBS KC_NONUS_BSLASH
+#define KC_LCAP KC_LOCKING_CAPS
 #define KC_ERAS KC_ALT_ERASE,
 #define KC_ERAS KC_ALT_ERASE,
 #define KC_CLR  KC_CLEAR
 #define KC_CLR  KC_CLEAR
 /* Japanese specific */
 /* Japanese specific */

+ 7 - 17
keyboard/gh60/config.h

@@ -27,16 +27,21 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PRODUCT         GH60
 #define PRODUCT         GH60
 #define DESCRIPTION     t.m.k. keyboard firmware for GH60
 #define DESCRIPTION     t.m.k. keyboard firmware for GH60
 
 
-/* matrix size */
+/* key matrix size */
 #define MATRIX_ROWS 5
 #define MATRIX_ROWS 5
 #define MATRIX_COLS 14
 #define MATRIX_COLS 14
 
 
 /* define if matrix has ghost */
 /* define if matrix has ghost */
 //#define MATRIX_HAS_GHOST
 //#define MATRIX_HAS_GHOST
 
 
-/* Set 0 if need no debouncing */
+/* Set 0 if debouncing isn't needed */
 #define DEBOUNCE    5
 #define DEBOUNCE    5
 
 
+/* Mechanical locking CapsLock support. Use KC_LCAP instead of KC_CAPS in keymap */
+#define CAPSLOCK_LOCKING_ENABLE
+/* Locking CapsLock resynchronize hack, which won't work on Linux */
+#define CAPSLOCK_LOCKING_RESYNC_ENABLE
+
 /* key combination for command */
 /* key combination for command */
 #define IS_COMMAND() ( \
 #define IS_COMMAND() ( \
     keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
     keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
@@ -51,20 +56,5 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
  */
 #define BOOTLOADER_SIZE 4096
 #define BOOTLOADER_SIZE 4096
 
 
-/* 
- * Boot magic keys
- * call some function by pressing key when pluging cable or powering on.
- */
-/* key position on matrix(ROW:COL) */
-#define KEY_FN          0x4A
-#define KEY_D           0x23
-#define KEY_ESC         0x00
-#define KEY_IS_ON(key)  matrix_is_on((key)>>4, (key)&0xF)
-/* kick up bootloader */
-#define IS_BOOTMAGIC_BOOTLOADER()       KEY_IS_ON(KEY_FN)
-/* debug on */
-#define IS_BOOTMAGIC_DEBUG()            KEY_IS_ON(KEY_D)
-/* eeprom clear */
-#define IS_BOOTMAGIC_EEPROM_CLEAR()     KEY_IS_ON(KEY_ESC)
 
 
 #endif
 #endif