Skip to content

Commit

Permalink
Add FnLock key
Browse files Browse the repository at this point in the history
Implement a FnLock toggle and a custom key for it.

- When disabled, F1-F12 behave normally
- When enabled, F1-F12 behave as the alternate function

Set it to Fn+CapsLock by default.

Signed-off-by: Tim Crawford <[email protected]>
  • Loading branch information
crawfxrd committed Jul 21, 2023
1 parent 0d83819 commit cc745cf
Show file tree
Hide file tree
Showing 11 changed files with 112 additions and 4 deletions.
8 changes: 8 additions & 0 deletions src/board/system76/common/kbscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <board/acpi.h>
#include <board/fan.h>
#include <board/gpio.h>
#include <board/keymap.h>
#include <board/kbc.h>
#include <board/kbled.h>
#include <board/kbscan.h>
Expand Down Expand Up @@ -202,6 +203,12 @@ bool kbscan_press(uint16_t key, bool pressed, uint8_t *layer) {
pmc_swi();
}

if (key == K_FNLOCK && pressed) {
DEBUG("Toggling FnLock\n");
keymap_fnlock ^= 1;
return true;
}

switch (key & KT_MASK) {
case (KT_NORMAL):
if (kbscan_enabled) {
Expand Down Expand Up @@ -298,6 +305,7 @@ static inline bool key_should_repeat(uint16_t key) {
case K_CAMERA_TOGGLE:
case K_DISPLAY_TOGGLE:
case K_FAN_TOGGLE:
case K_FNLOCK:
case K_KBD_BKL:
case K_KBD_COLOR:
case K_KBD_TOGGLE:
Expand Down
4 changes: 4 additions & 0 deletions src/board/system76/common/keymap.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#include <board/flash.h>
#include <board/keymap.h>

bool keymap_fnlock = false;

uint16_t __xdata DYNAMIC_KEYMAP[KM_LAY][KM_OUT][KM_IN];

// Config is in the last sector of flash
Expand Down Expand Up @@ -69,6 +71,8 @@ bool keymap_save_config(void) {

bool keymap_get(uint8_t layer, uint8_t output, uint8_t input, uint16_t *value) {
if (layer < KM_LAY && output < KM_OUT && input < KM_IN) {
if (keymap_fnlock && keymap_is_f_key(output, input))
layer ^= 1;
*value = DYNAMIC_KEYMAP[layer][output][input];
return true;
} else {
Expand Down
8 changes: 8 additions & 0 deletions src/common/include/common/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ extern uint16_t __xdata DYNAMIC_KEYMAP[KM_LAY][KM_OUT][KM_IN];
#endif

#if HAVE_KEYMAP
// FnLock config
extern bool keymap_fnlock;

// Initialize the dynamic keymap
void keymap_init(void);
// Set the dynamic keymap to the default keymap
Expand Down Expand Up @@ -278,4 +281,9 @@ uint16_t keymap_translate(uint16_t key);
#define K_INT_1 (0x61)
#define K_INT_2 (0x5D)

// XXX: Custom keys

#define KF_CUSTOM (0x0200)
#define K_FNLOCK (KF_CUSTOM | 0x01)

#endif // _COMMON_KEYMAP_H
21 changes: 21 additions & 0 deletions src/keyboard/system76/14in_83/include/board/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,25 @@
#define MATRIX_FN_INPUT 0
#define MATRIX_FN_OUTPUT 6

static inline bool keymap_is_f_key(uint8_t row, uint8_t col) {
switch (row) {
case 8:
return col == 6 || col == 7;
case 9:
return col == 6 || col == 7;
case 10:
return col == 6 || col == 7;
case 11:
return col == 6 || col == 7;
case 12:
return col == 6 || col == 7;
case 13:
return col == 7;
case 15:
return col == 5;
default:
return false;
}
}

#endif // _BOARD_KEYMAP_H
2 changes: 1 addition & 1 deletion src/keyboard/system76/14in_83/keymap/default.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ LAYOUT(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_HOME, K_END, K_PRINT_SCREEN, K_DEL,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH,
K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER,
K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_PGUP, K_UP, K_PGDN,
K_LEFT, K_DOWN, K_RIGHT
Expand Down
21 changes: 21 additions & 0 deletions src/keyboard/system76/14in_86/include/board/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,25 @@
#define MATRIX_FN_INPUT 0
#define MATRIX_FN_OUTPUT 6

static inline bool keymap_is_f_key(uint8_t row, uint8_t col) {
switch (row) {
case 8:
return col == 6 || col == 7;
case 9:
return col == 6 || col == 7;
case 10:
return col == 6 || col == 7;
case 11:
return col == 6 || col == 7;
case 12:
return col == 6 || col == 7;
case 13:
return col == 7;
case 15:
return col == 5;
default:
return false;
}
}

#endif // _BOARD_KEYMAP_H
2 changes: 1 addition & 1 deletion src/keyboard/system76/14in_86/keymap/default.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ LAYOUT(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_PAUSE, K_NUM_LOCK, K_SCROLL_LOCK,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_ASTERISK, K_MINUS, K_EQUALS, K_BKSP, K_HOME,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_NUM_4, K_NUM_5, K_NUM_6, K_NUM_SLASH, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_PGUP,
K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_NUM_ENTER, K_PGDN,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_NUM_ENTER, K_PGDN,
K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_NUM_0, K_COMMA, K_NUM_PERIOD, K_NUM_PLUS, K_RIGHT_SHIFT, K_UP, K_END,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT
)
Expand Down
21 changes: 21 additions & 0 deletions src/keyboard/system76/15in_102/include/board/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,25 @@
#define MATRIX_FN_INPUT 3
#define MATRIX_FN_OUTPUT 17

static inline bool keymap_is_f_key(uint8_t row, uint8_t col) {
switch (row) {
case 8:
return col == 5 || col == 7;
case 9:
return col == 3;
case 10:
return col == 5 || col == 6;
case 12:
return col == 5;
case 13:
return col == 3 || col == 7;
case 14:
return col == 1 || col == 3;
case 16:
return col == 6 || col == 7;
default:
return false;
}
}

#endif // _BOARD_KEYMAP_H
2 changes: 1 addition & 1 deletion src/keyboard/system76/15in_102/keymap/default.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ LAYOUT(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_SCROLL_LOCK, K_DEL, K_HOME, K_END, K_PAUSE, K_PAUSE,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_KBD_COLOR, K_KBD_TOGGLE, K_KBD_DOWN,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_KBD_UP,
K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD
)
Expand Down
25 changes: 25 additions & 0 deletions src/keyboard/system76/15in_102_nkey/include/board/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,29 @@
#define MATRIX_FN_INPUT 0
#define MATRIX_FN_OUTPUT 4

static inline bool keymap_is_f_key(uint8_t row, uint8_t col) {
switch (row) {
case 1:
return col == 1;
case 4:
return col == 2;
case 6:
return col == 2 || col == 3 || col == 4;
case 7:
return col == 1;
case 10:
return col == 2;
case 11:
return col == 2 || col == 3;
case 12:
return col == 0;
case 13:
return col == 3;
case 15:
return col == 1;
default:
return false;
}
}

#endif // _BOARD_KEYMAP_H
2 changes: 1 addition & 1 deletion src/keyboard/system76/15in_102_nkey/keymap/default.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ LAYOUT(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_SCROLL_LOCK, K_DEL, K_HOME, K_END, K_PAUSE, K_PAUSE,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_KBD_COLOR, K_KBD_TOGGLE, K_KBD_DOWN,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_KBD_UP,
K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD
)
Expand Down

0 comments on commit cc745cf

Please sign in to comment.