summaryrefslogtreecommitdiffstats
path: root/users/konstantin/konstantin.c
blob: f5c59f9eb12fe0f388e0cbcc933b649fe0e020bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "konstantin.h"

__attribute__((weak))
void keyboard_pre_init_keymap(void) {}

void keyboard_pre_init_user(void) {
  keyboard_pre_init_keymap();
}

__attribute__((weak))
void eeconfig_init_keymap(void) {}

void eeconfig_init_user(void) {
  eeconfig_init_keymap();
}

__attribute__((weak))
void matrix_init_keymap(void) {}

void matrix_init_user(void) {
  matrix_init_keymap();
}

__attribute__((weak))
void keyboard_post_init_keymap(void) {}

void keyboard_post_init_user(void) {
  keyboard_post_init_keymap();
}

__attribute__((weak))
void matrix_scan_keymap(void) {}

void matrix_scan_user(void) {
  matrix_scan_keymap();
}

__attribute__((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  return true;
}

#ifdef LAYER_NUMPAD
static void toggle_numpad(void) {
  layer_invert(L_NUMPAD);
  bool numpad_on = IS_LAYER_ON(L_NUMPAD);
  bool num_lock_on = IS_HOST_LED_ON(USB_LED_NUM_LOCK);
  if (num_lock_on != numpad_on) {
    tap_code(KC_NLCK);  // Toggle Num Lock to match layer state
  }
}
#endif

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  if (!process_record_keymap(keycode, record)) {
    return false;
  }

  switch (keycode) {
  case CLEAR:
    if (record->event.pressed) {
      SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
    }
    return false;

  case DST_P_R:
    (record->event.pressed ? register_code16 : unregister_code16)(
      (get_mods() & DST_MOD_MASK) ? DST_REM : DST_PRV
    );
    return false;

  case DST_N_A:
    (record->event.pressed ? register_code16 : unregister_code16)(
      (get_mods() & DST_MOD_MASK) ? DST_ADD : DST_NXT
    );
    return false;

#ifdef LAYER_FN
  static bool fn_lock;

  case FN_FNLK:
    if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
      fn_lock = !IS_LAYER_ON(L_FN);  // Fn layer will be toggled after this
    }
    return true;
#endif

#ifdef LAYER_NUMPAD
  case NUMPAD:
    if (record->event.pressed) {
      toggle_numpad();
    }
    return false;
#endif

  case KC_ESC:
    if (record->event.pressed) {
#ifdef LAYER_NUMPAD
      if (IS_LAYER_ON(L_NUMPAD)) {
        toggle_numpad();
        return false;
      }
#endif
#ifdef LAYER_FN
      if (IS_LAYER_ON(L_FN) && fn_lock) {
        layer_off(L_FN);
        return fn_lock = false;
      }
#endif
    }
    return true;

  default:
    return true;
  }
}

__attribute__((weak))
uint32_t layer_state_set_keymap(uint32_t state) {
  return state;
}

uint32_t layer_state_set_user(uint32_t state) {
  return layer_state_set_keymap(state);
}

__attribute__((weak))
void led_set_keymap(uint8_t usb_led) {}

void led_set_user(uint8_t usb_led) {
  led_set_keymap(usb_led);
}

__attribute__((weak))
void suspend_power_down_keymap(void) {}

void suspend_power_down_user(void) {
  suspend_power_down_keymap();
}

__attribute__((weak))
void suspend_wakeup_init_keymap(void) {}

void suspend_wakeup_init_user(void) {
  suspend_wakeup_init_keymap();
}

__attribute__((weak))
void startup_keymap(void) {}

void startup_user(void) {  // Currently not called anywhere
  startup_keymap();
}

__attribute__((weak))
void shutdown_keymap(void) {}

void shutdown_user(void) {
  shutdown_keymap();
}