[Keymap] Add prog_qgmlwb keymap (#16890)

This commit is contained in:
David Kristoffersen 2022-07-02 14:18:21 +02:00 committed by GitHub
parent ef633cf461
commit a80943579c
Failed to generate hash of commit
27 changed files with 750 additions and 0 deletions

View 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"

View file

@ -0,0 +1,3 @@
# Hardware
This directory contains hardware related macros.

View 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

View 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);

View 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;
}

View 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;
}

View 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;
}

View 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);

View 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 // Å

View file

@ -0,0 +1,3 @@
# Macros
This directory contains any type of dynamic and static macros.

View 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

View file

@ -0,0 +1,3 @@
# Overview
This userspace contains all the utility functions and macros related to my keymaps.

View 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

View 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

View 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);

View file

@ -0,0 +1,3 @@
# Utility
This directory contains utility functions meant to assist the other files of the userspace.