forked from mirrors/qmk_userspace
[Keymap] Add prog_qgmlwb keymap (#16890)
This commit is contained in:
parent
ef633cf461
commit
a80943579c
27 changed files with 750 additions and 0 deletions
18
users/davidkristoffersen/davidkristoffersen.h
Normal file
18
users/davidkristoffersen/davidkristoffersen.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
#include "src/enums.h"
|
||||
|
||||
#ifdef LAYER_NO
|
||||
# include "macros/norwegian.h"
|
||||
#endif
|
||||
|
||||
#include "util/functions.h"
|
||||
|
||||
#include "hardware/split_space.h"
|
||||
|
||||
#include "macros/macros.h"
|
3
users/davidkristoffersen/hardware/readme.md
Normal file
3
users/davidkristoffersen/hardware/readme.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Hardware
|
||||
|
||||
This directory contains hardware related macros.
|
23
users/davidkristoffersen/hardware/split_space.c
Normal file
23
users/davidkristoffersen/hardware/split_space.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "split_space.h"
|
||||
|
||||
#ifdef SPLIT_SPACE
|
||||
void handle_split_space(uint16_t keycode) {
|
||||
// Disable modifiers when numpad is active
|
||||
if (IS_LAYER_ON(NUMPAD)) clear_oneshot_mods();
|
||||
|
||||
if (keycode == KC_LSPC) {
|
||||
// 2ng tap: Activate ctrl if shift is active
|
||||
if (get_oneshot_mods() & MOD_MASK_SHIFT) {
|
||||
clear_oneshot_mods();
|
||||
set_oneshot_mods(MOD_LCTL);
|
||||
}
|
||||
// 1st. tap: Activate shift if no modifier is active
|
||||
else {
|
||||
set_oneshot_mods(MOD_LSFT);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
16
users/davidkristoffersen/hardware/split_space.h
Normal file
16
users/davidkristoffersen/hardware/split_space.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "davidkristoffersen.h"
|
||||
|
||||
#define KC_RSPC KC_SPACE
|
||||
|
||||
#ifdef SPLIT_SPACE
|
||||
# define KC_LSPC LT(NUMPAD, KC_NO)
|
||||
#else
|
||||
# define KC_LSPC KC_SPACE
|
||||
#endif
|
||||
|
||||
void handle_split_space(uint16_t keycode);
|
36
users/davidkristoffersen/macros/debug.c
Normal file
36
users/davidkristoffersen/macros/debug.c
Normal file
|
@ -0,0 +1,36 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "macros.h"
|
||||
|
||||
// Replace key records with macros
|
||||
bool handle_test(uint16_t keycode) {
|
||||
switch (keycode) {
|
||||
case KC_T0: {
|
||||
// Test QK_MAKE command
|
||||
SEND_STRING("qmk compile -kb " QMK_KEYBOARD " -km " QMK_KEYMAP);
|
||||
break;
|
||||
}
|
||||
case KC_T1:
|
||||
// Test ascii characters
|
||||
SEND_STRING(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
|
||||
break;
|
||||
case KC_T2:
|
||||
#ifdef LAYER_NO
|
||||
// Test other characters
|
||||
tap_code16(NO_AE);
|
||||
tap_code16(NO_OE);
|
||||
tap_code16(NO_AA);
|
||||
tap_code16(S(NO_AE));
|
||||
tap_code16(S(NO_OE));
|
||||
tap_code16(S(NO_AA));
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
bool process_debug(uint16_t keycode, keyrecord_t* record) {
|
||||
HANDLE_FALSE(handle_test(keycode));
|
||||
return true;
|
||||
}
|
40
users/davidkristoffersen/macros/language.c
Normal file
40
users/davidkristoffersen/macros/language.c
Normal file
|
@ -0,0 +1,40 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "macros.h"
|
||||
|
||||
bool handle_language(uint16_t keycode) {
|
||||
#ifdef LAYER_NO
|
||||
// Handle conversion of English to Norwegian codes
|
||||
uint16_t org_keycode = keycode;
|
||||
keycode = get_norwegian_code(keycode);
|
||||
#endif
|
||||
|
||||
#ifndef NO_SPECIAL_SHIFT
|
||||
// Handle conversion of special shift codes
|
||||
if (get_mods() & MOD_MASK_SHIFT) {
|
||||
uint16_t shifted_key = get_special_shifted_code(keycode);
|
||||
if (shifted_key != keycode) {
|
||||
// Tap shifted key while shift is disabled
|
||||
unregister_code(KC_LSFT);
|
||||
tap_code16(shifted_key);
|
||||
register_code(KC_LSFT);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef LAYER_NO
|
||||
// Tap new language key
|
||||
if (keycode != org_keycode) {
|
||||
tap_code16(keycode);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
bool process_language(uint16_t keycode, keyrecord_t* record) {
|
||||
HANDLE_FALSE(handle_language(keycode));
|
||||
return true;
|
||||
}
|
16
users/davidkristoffersen/macros/macros.c
Normal file
16
users/davidkristoffersen/macros/macros.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "macros.h"
|
||||
|
||||
// Prepend key records with macros
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t* record) {
|
||||
if (record->event.pressed) {
|
||||
#ifdef SPLIT_SPACE
|
||||
handle_split_space(keycode, record);
|
||||
#endif
|
||||
HANDLE_FALSE(process_debug(keycode, record));
|
||||
HANDLE_FALSE(process_language(keycode, record));
|
||||
}
|
||||
return true;
|
||||
}
|
23
users/davidkristoffersen/macros/macros.h
Normal file
23
users/davidkristoffersen/macros/macros.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "davidkristoffersen.h"
|
||||
|
||||
enum keycodes {
|
||||
// Test keys
|
||||
KC_T0 = SAFE_RANGE,
|
||||
KC_T1,
|
||||
KC_T2,
|
||||
// Norwegian Æ, Ø, Å
|
||||
KC_AE,
|
||||
KC_OE,
|
||||
KC_AA
|
||||
};
|
||||
|
||||
bool process_debug(uint16_t keycode, keyrecord_t* record);
|
||||
bool process_language(uint16_t keycode, keyrecord_t* record);
|
||||
|
||||
// Prepend key records with macros
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t* record);
|
19
users/davidkristoffersen/macros/norwegian.h
Normal file
19
users/davidkristoffersen/macros/norwegian.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "keymap_extras/keymap_norwegian.h"
|
||||
#include "davidkristoffersen.h"
|
||||
|
||||
// Better norwegian defines
|
||||
#undef NO_LESS
|
||||
#define NO_LESS KC_NUBS // <
|
||||
#undef NO_GRTR
|
||||
#define NO_GRTR S(NO_LESS) // >
|
||||
#undef NO_AE
|
||||
#define NO_AE KC_QUOT // Æ
|
||||
#undef NO_OE
|
||||
#define NO_OE KC_SCLN // Ø
|
||||
#undef NO_AA
|
||||
#define NO_AA KC_LBRC // Å
|
3
users/davidkristoffersen/macros/readme.md
Normal file
3
users/davidkristoffersen/macros/readme.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Macros
|
||||
|
||||
This directory contains any type of dynamic and static macros.
|
8
users/davidkristoffersen/post_config.h
Normal file
8
users/davidkristoffersen/post_config.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef LAYER_EN
|
||||
# define LAYER_EN LAYER_DEFAULT
|
||||
#endif
|
3
users/davidkristoffersen/readme.md
Normal file
3
users/davidkristoffersen/readme.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Overview
|
||||
|
||||
This userspace contains all the utility functions and macros related to my keymaps.
|
12
users/davidkristoffersen/rules.mk
Normal file
12
users/davidkristoffersen/rules.mk
Normal file
|
@ -0,0 +1,12 @@
|
|||
SRC += $(USER_PATH)/util/functions.c \
|
||||
$(USER_PATH)/hardware/split_space.c \
|
||||
$(USER_PATH)/macros/macros.c \
|
||||
$(USER_PATH)/macros/debug.c \
|
||||
$(USER_PATH)/macros/language.c
|
||||
|
||||
# Firmware size optimizations
|
||||
ifeq ($(strip $(SIZE_OPTIMIZE)), yes)
|
||||
CONSOLE_ENABLE := no # 1646: Console for debug
|
||||
AUDIO_ENABLE := no # 8682: Audio output on port C6
|
||||
LTO_ENABLE := yes # 2772: Link time optimization
|
||||
endif
|
111
users/davidkristoffersen/util/functions.c
Normal file
111
users/davidkristoffersen/util/functions.c
Normal file
|
@ -0,0 +1,111 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "functions.h"
|
||||
|
||||
#ifndef NO_SPECIAL_SHIFT
|
||||
// Code set to swap struct
|
||||
typedef struct code_set {
|
||||
uint16_t pre;
|
||||
uint16_t post;
|
||||
} code_set_t;
|
||||
|
||||
// Shift codes conversion struct
|
||||
typedef struct shift_code {
|
||||
int lang;
|
||||
int size;
|
||||
code_set_t* codes;
|
||||
} shift_code_t;
|
||||
|
||||
#ifdef LAYER_NO
|
||||
code_set_t NO_SHIFT_CODES [] = {
|
||||
{NO_QUOT, NO_DQUO},
|
||||
{NO_BSLS, NO_PIPE},
|
||||
};
|
||||
#endif
|
||||
|
||||
code_set_t EN_SHIFT_CODES [] = {
|
||||
{KC_COMM, KC_SCLN},
|
||||
{KC_DOT, KC_COLN},
|
||||
};
|
||||
|
||||
// Array of shift code conversions
|
||||
const shift_code_t SHIFT_CODES [] = {
|
||||
#ifdef LAYER_NO
|
||||
{.lang = LAYER_NO,
|
||||
.size = ARR_LEN(NO_SHIFT_CODES),
|
||||
.codes = NO_SHIFT_CODES},
|
||||
#endif
|
||||
{.lang = LAYER_EN,
|
||||
.size = ARR_LEN(EN_SHIFT_CODES),
|
||||
.codes = EN_SHIFT_CODES},
|
||||
};
|
||||
const int SHIFT_CODES_SIZE = ARR_LEN(SHIFT_CODES);
|
||||
#endif
|
||||
|
||||
#ifdef LAYER_NO
|
||||
// Array of English to Norwegian code translations
|
||||
const code_set_t EN2NO_CODES [] = {
|
||||
{KC_QUOT, NO_QUOT},
|
||||
{KC_MINS, NO_MINS},
|
||||
{KC_BSLS, NO_BSLS},
|
||||
{KC_LBRC, NO_LBRC},
|
||||
{KC_LCBR, NO_LCBR},
|
||||
{KC_LPRN, NO_LPRN},
|
||||
{KC_LT, NO_LESS},
|
||||
{KC_GT, NO_GRTR},
|
||||
{KC_RPRN, NO_RPRN},
|
||||
{KC_RCBR, NO_RCBR},
|
||||
{KC_RBRC, NO_RBRC},
|
||||
{KC_AMPR, NO_AMPR},
|
||||
{KC_EQL, NO_EQL},
|
||||
{KC_PLUS, NO_PLUS},
|
||||
{KC_ASTR, NO_ASTR},
|
||||
{KC_SLSH, NO_SLSH},
|
||||
{KC_TILD, NO_TILD},
|
||||
{KC_AE, NO_AE},
|
||||
{KC_OE, NO_OE},
|
||||
{KC_AA, NO_AA},
|
||||
{KC_QUES, NO_QUES},
|
||||
{KC_AT, NO_AT},
|
||||
{KC_CIRC, NO_CIRC},
|
||||
{KC_DLR, NO_DLR},
|
||||
{KC_GRV, NO_GRV}
|
||||
};
|
||||
const int EN2NO_CODES_SIZE = ARR_LEN(EN2NO_CODES);
|
||||
#endif
|
||||
|
||||
// Check if layer is an active default layer
|
||||
bool is_default_on(int layer) {
|
||||
return layer == LAYER_DEFAULT
|
||||
? true
|
||||
: layer_state_cmp(default_layer_state, layer);
|
||||
}
|
||||
|
||||
#ifndef NO_SPECIAL_SHIFT
|
||||
// Get special shifted code
|
||||
uint16_t get_special_shifted_code(uint16_t keycode) {
|
||||
for (int i = 0; i < SHIFT_CODES_SIZE; i++) {
|
||||
if (IS_DEFAULT_OFF(SHIFT_CODES[i].lang)) continue;
|
||||
for (int j = 0; j < SHIFT_CODES[i].size; j++) {
|
||||
if (keycode == SHIFT_CODES[i].codes[j].pre)
|
||||
return SHIFT_CODES[i].codes[j].post;
|
||||
}
|
||||
}
|
||||
return keycode;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef LAYER_NO
|
||||
// Get language specific code
|
||||
uint16_t get_norwegian_code(uint16_t keycode) {
|
||||
if (IS_DEFAULT_ON(LAYER_NO)) {
|
||||
for (int i = 0; i < EN2NO_CODES_SIZE; i++) {
|
||||
if (keycode == EN2NO_CODES[i].pre) {
|
||||
return EN2NO_CODES[i].post;
|
||||
}
|
||||
}
|
||||
}
|
||||
return keycode;
|
||||
}
|
||||
#endif
|
32
users/davidkristoffersen/util/functions.h
Normal file
32
users/davidkristoffersen/util/functions.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2022 David Kristoffersen (@davidkristoffersen)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "davidkristoffersen.h"
|
||||
|
||||
// Default layer if none is specified
|
||||
#define LAYER_DEFAULT -1
|
||||
|
||||
// Check if layer is an active default layer
|
||||
#define IS_DEFAULT_ON(layer) is_default_on(layer)
|
||||
// Check if layer is an inactive default layer
|
||||
#define IS_DEFAULT_OFF(layer) !is_default_on(layer)
|
||||
|
||||
// Return false if test equal false
|
||||
#define HANDLE_FALSE(bool) if (!bool) return false;
|
||||
// Generic array lenght define
|
||||
#define ARR_LEN(arr) (sizeof(arr) / sizeof(arr)[0])
|
||||
// Printf-like functionality for send_string
|
||||
#define SEND_VAR(str, ...) \
|
||||
do { \
|
||||
char var[128]; \
|
||||
sprintf(var, str, __VA_ARGS__); \
|
||||
send_string(var); \
|
||||
} while(0)
|
||||
|
||||
// Get special shifted code
|
||||
uint16_t get_special_shifted_code(uint16_t keycode);
|
||||
|
||||
// Get language specific code
|
||||
uint16_t get_norwegian_code(uint16_t keycode);
|
3
users/davidkristoffersen/util/readme.md
Normal file
3
users/davidkristoffersen/util/readme.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Utility
|
||||
|
||||
This directory contains utility functions meant to assist the other files of the userspace.
|
Loading…
Add table
Add a link
Reference in a new issue