summaryrefslogtreecommitdiff
path: root/adb_usb/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'adb_usb/matrix.c')
-rw-r--r--adb_usb/matrix.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/adb_usb/matrix.c b/adb_usb/matrix.c
index 51dd37fca2..a2367af56a 100644
--- a/adb_usb/matrix.c
+++ b/adb_usb/matrix.c
@@ -25,6 +25,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "print.h"
#include "util.h"
#include "debug.h"
+#include "host.h"
+#include "led.h"
#include "adb.h"
#include "matrix.h"
@@ -36,6 +38,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# error "MATRIX_ROWS must not exceed 255"
#endif
+#define CAPS 0x39
+#define CAPS_UP (CAPS | 0x80)
+#define ROW(key) ((key)>>3&0x0F)
+#define COL(key) ((key)&0x07)
+
static bool _matrix_is_modified = false;
@@ -93,11 +100,35 @@ uint8_t matrix_scan(void)
key0 = codes>>8;
key1 = codes&0xFF;
+#ifdef MATRIX_HAS_LOCKING_CAPS
+ // Send Caps key up event
+ if (matrix_is_on(ROW(CAPS), COL(CAPS))) {
+ _matrix_is_modified = true;
+ _register_key(CAPS_UP);
+ }
+#endif
if (codes == 0) { // no keys
return 0;
} else if (key0 == 0xFF && key1 != 0xFF) { // error
return codes&0xFF;
} else {
+#ifdef MATRIX_HAS_LOCKING_CAPS
+ if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
+ // Ignore LockingCaps key down event when CAPS LOCK is on
+ if (key0 == CAPS && (key1 == CAPS || key1 == 0xFF)) return 0;
+ if (key0 == CAPS) key0 = key1;
+ if (key1 == CAPS) key1 = 0xFF;
+ // Convert LockingCaps key up event into down event
+ if (key0 == CAPS_UP) key0 = CAPS;
+ if (key1 == CAPS_UP) key1 = CAPS;
+ } else {
+ // CAPS LOCK off:
+ // Ignore LockingCaps key up event when CAPS LOCK is off
+ if (key0 == CAPS_UP && (key1 == CAPS_UP || key1 == 0xFF)) return 0;
+ if (key0 == CAPS_UP) key0 = key1;
+ if (key1 == CAPS_UP) key1 = 0xFF;
+ }
+#endif
_matrix_is_modified = true;
_register_key(key0);
if (key1 != 0xFF) // key1 is 0xFF when no second key.