1
0

Add mechanical locking switch support for NumLock and ScrollLock

This commit is contained in:
tmk 2013-07-23 10:56:03 +09:00
parent b52dc89a81
commit 0cb80001b4
3 changed files with 58 additions and 11 deletions

View File

@ -164,12 +164,12 @@ TODO: Magic key combination to avoid unintentional press during plug in
**TBD** **TBD**
Mechanical Locking support for CapsLock Mechanical Locking support
--------------------------------------- --------------------------
To enable this feature define these two macros in `config.h` and use `KC_LCAP` for locking CapsLock in keymap instead of normal `KC_CAPS`. Resync option tries to keep lock switch state consistent with keyboard LED state. This feature makes it possible for you to use mechanical switch for `CapsLock`, `NumLock` or `ScrollLock`. To enable this feature define these macros in `config.h` and use `KC_LCAP`, `KC_LNUM` or `KC_LSCR` in keymap for locking key instead of normal `KC_CAPS`, `KC_NLCK` or `KC_SLCK`. Resync option tries to keep lock switch state consistent with keyboard LED state.
#define CAPSLOCK_LOCKING_ENABLE #define LOCKING_SUPPORT_ENABLE
#define CAPSLOCK_LOCKING_RESYNC_ENABLE #define LOCKING_RESYNC_ENABLE
Start Your Own Project Start Your Own Project

View File

@ -336,9 +336,10 @@ void register_code(uint8_t code)
if (code == KC_NO) { if (code == KC_NO) {
return; return;
} }
#ifdef CAPSLOCK_LOCKING_ENABLE
#ifdef LOCKING_SUPPORT_ENABLE
else if (KC_LOCKING_CAPS == code) { else if (KC_LOCKING_CAPS == code) {
#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE #ifdef LOCKING_RESYNC_ENABLE
// Resync: ignore if caps lock already is on // Resync: ignore if caps lock already is on
if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) return; if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) return;
#endif #endif
@ -347,7 +348,28 @@ void register_code(uint8_t code)
host_del_key(KC_CAPSLOCK); host_del_key(KC_CAPSLOCK);
host_send_keyboard_report(); host_send_keyboard_report();
} }
else if (KC_LOCKING_NUM == code) {
#ifdef LOCKING_RESYNC_ENABLE
if (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) return;
#endif #endif
host_add_key(KC_NUMLOCK);
host_send_keyboard_report();
host_del_key(KC_NUMLOCK);
host_send_keyboard_report();
}
else if (KC_LOCKING_SCROLL == code) {
#ifdef LOCKING_RESYNC_ENABLE
if (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) return;
#endif
host_add_key(KC_SCROLLLOCK);
host_send_keyboard_report();
host_del_key(KC_SCROLLLOCK);
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;
@ -386,9 +408,10 @@ void unregister_code(uint8_t code)
if (code == KC_NO) { if (code == KC_NO) {
return; return;
} }
#ifdef CAPSLOCK_LOCKING_ENABLE
#ifdef LOCKING_SUPPORT_ENABLE
else if (KC_LOCKING_CAPS == code) { else if (KC_LOCKING_CAPS == code) {
#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE #ifdef LOCKING_RESYNC_ENABLE
// Resync: ignore if caps lock already is off // Resync: ignore if caps lock already is off
if (!(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) return; if (!(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) return;
#endif #endif
@ -397,7 +420,28 @@ void unregister_code(uint8_t code)
host_del_key(KC_CAPSLOCK); host_del_key(KC_CAPSLOCK);
host_send_keyboard_report(); host_send_keyboard_report();
} }
else if (KC_LOCKING_NUM == code) {
#ifdef LOCKING_RESYNC_ENABLE
if (!(host_keyboard_leds() & (1<<USB_LED_NUM_LOCK))) return;
#endif #endif
host_add_key(KC_NUMLOCK);
host_send_keyboard_report();
host_del_key(KC_NUMLOCK);
host_send_keyboard_report();
}
else if (KC_LOCKING_SCROLL == code) {
#ifdef LOCKING_RESYNC_ENABLE
if (!(host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK))) return;
#endif
host_add_key(KC_SCROLLLOCK);
host_send_keyboard_report();
host_del_key(KC_SCROLLLOCK);
host_send_keyboard_report();
}
#endif
else if IS_KEY(code) { else if IS_KEY(code) {
host_del_key(code); host_del_key(code);
host_send_keyboard_report(); host_send_keyboard_report();

View File

@ -60,10 +60,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define KC_DEL KC_DELETE #define KC_DEL KC_DELETE
#define KC_INS KC_INSERT #define KC_INS KC_INSERT
#define KC_CAPS KC_CAPSLOCK #define KC_CAPS KC_CAPSLOCK
#define KC_CLCK KC_CAPSLOCK
#define KC_RGHT KC_RIGHT #define KC_RGHT KC_RIGHT
#define KC_PGDN KC_PGDOWN #define KC_PGDN KC_PGDOWN
#define KC_PSCR KC_PSCREEN #define KC_PSCR KC_PSCREEN
#define KC_SLCK KC_SCKLOCK #define KC_SLCK KC_SCROLLLOCK
#define KC_PAUS KC_PAUSE #define KC_PAUS KC_PAUSE
#define KC_BRK KC_PAUSE #define KC_BRK KC_PAUSE
#define KC_NLCK KC_NUMLOCK #define KC_NLCK KC_NUMLOCK
@ -82,6 +83,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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_LCAP KC_LOCKING_CAPS
#define KC_LNUM KC_LOCKING_NUM
#define KC_LSCR KC_LOCKING_SCROLL
#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 */
@ -230,7 +233,7 @@ enum hid_keyboard_keypad_usage {
KC_F11, KC_F11,
KC_F12, KC_F12,
KC_PSCREEN, KC_PSCREEN,
KC_SCKLOCK, KC_SCROLLLOCK,
KC_PAUSE, KC_PAUSE,
KC_INSERT, KC_INSERT,
KC_HOME, KC_HOME,