~ruther/qmk_firmware

d3f3da5112c241e1203bd91ae16cc7b0aa075c0c — Torben Hoffmann 6 years ago 7dcf923
Norman layout for the minidox keyboard (#5747)

* Norman layout with Lower and Raise layers working

* Add keymap_extra def for Norman layout
* Re-org'ed the modifiers as explained in the Readme
* Corrected colour legend for KLE that the Readme links to

* Use #pragma once in header file

* Use pragma once and move user config to config.h

* Move definitions to the right file and correct link in Readme

* Move def of NM_COLN to the logical place in header file

* Add sendstring_norman.h for when the laptop layout is not QWERTY

* Update quantum/keymap_extras/sendstring_norman.h

Co-Authored-By: lehoff <torben.lehoff@gmail.com>
A keyboards/minidox/keymaps/norman/config.h => keyboards/minidox/keymaps/norman/config.h +5 -0
@@ 0,0 1,5 @@
#pragma once

#define PERMISSIVE_HOLD
#define QMK_KEYS_PER_SCAN 4 
#define TAPPING_TERM 160

A keyboards/minidox/keymaps/norman/keymap.c => keyboards/minidox/keymaps/norman/keymap.c +69 -0
@@ 0,0 1,69 @@
#include QMK_KEYBOARD_H

#include <sendstring_norman.h>


extern keymap_config_t keymap_config;

// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum layers {
    _NORMAN,
    _LOWER,
    _RAISE,
    _ADJUST
};

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  ADJUST
};

// Defines for task manager and such
#define CALTDEL LCTL(LALT(KC_DEL))
#define TSKMGR LCTL(LSFT(KC_ESC))
#define DSK_LFT LGUI(LCTL(KC_LEFT))
#define DSK_RT  LGUI(LCTL(KC_RIGHT))

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {


[_NORMAN] = LAYOUT( \
  NM_Q,    NM_W,    NM_D,    NM_F,    NM_K,                       NM_J,    NM_U,    NM_R,    NM_L,    NM_SCLN,    \
  NM_A,    NM_S,    NM_E,    NM_T,    NM_G,                       NM_Y,    NM_N,    NM_I,    NM_O,    NM_H, \
  NM_Z,    NM_X,    NM_C,    NM_V,    NM_B,                       NM_P,    NM_M,    NM_COMM, NM_DOT,  NM_SLSH, \
    LGUI_T(KC_ENT), LT(_RAISE, KC_ESC), SFT_T(KC_BSPC),    CTL_T(KC_SPC), LT(_LOWER, KC_TAB), ALT_T(KC_ENT)    \
),

[_RAISE] = LAYOUT( \
  KC_EXLM,    KC_AT,    KC_HASH, KC_DLR,  KC_PERC,      KC_PLUS, KC_7,     KC_8,   KC_9, KC_0,    \
  KC_CIRC,    KC_AMPR,  KC_TILD, KC_PIPE, KC_BSLS,      KC_MINUS,  KC_4,     KC_5,   KC_6, KC_EQL, \
  KC_DQT,     KC_QUOT,  KC_UNDS, KC_GRV,  _______,      KC_ASTR,  KC_1,     KC_2,   KC_3, _______, \
                        _______, _______, _______,      _______,  MO(_ADJUST), _______                    \
),


[_LOWER] = LAYOUT( \
  KC_ESC,   KC_HOME, KC_UP,   KC_END,   _______,     _______, KC_LPRN, KC_RPRN,  _______, _______,
  KC_VOLU,  KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGUP,     _______, KC_LBRC, KC_RBRC,  _______, _______, \
  KC_VOLD,  KC_MPRV, KC_MPLY, KC_MNXT,  KC_PGDN,     _______, KC_LCBR, KC_RCBR,  _______,  _______, \
                  _______, MO(_ADJUST), _______,      _______,  _______,  _______                    \
),

[_ADJUST] =  LAYOUT( \
  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,        KC_F6,   KC_F7,    KC_F8,   KC_F9,    KC_F10, \
  _______, DSK_LFT, _______, DSK_RT,  _______,      TSKMGR,  CALTDEL,  _______, KC_F11,   KC_F12, \
  RESET,   _______, _______, _______, _______,      _______, _______,  _______, _______,  _______, \
                    _______, _______, _______,      _______, _______,  _______                    \
)

};

void persistant_default_layer_set(uint16_t default_layer) {
  eeconfig_update_default_layer(default_layer);
  default_layer_set(default_layer);
}

A keyboards/minidox/keymaps/norman/readme.md => keyboards/minidox/keymaps/norman/readme.md +56 -0
@@ 0,0 1,56 @@
# Minidox Norman Layout by LeHoff
Based on the QWERTY layout created by Khitsule.
![lehoff](https://i.imgur.com/rKTdymp.png)

[KLE link](http://www.keyboard-layout-editor.com/#/gists/86ec49f9f820a8b9b36f6e0d2ef8fff7)

## Layers
| Layer | Legend |
| ----- | ------ |
| Base  |  Top left (black) |
| Lower | Bottom right (red) |
| Raise | Top right (orange) |
| Adjust | Front print |

## Features
* Raise/lower layers focus first on one-handed use
* Numpad on right hand with raise layer
* Navigation on left hand with lower layer (ESDF)
    * D refers to desktop left/right on Win 10 (win+ctrl+left/right)
* Heavy use of hold/tap dual function keys - from left to right:
    * Cmd/Enter
    * Raise/Esc
    * Shift/Backspace
    * Ctrl/Space
    * Lower/Tab
    * Alt/Enter


## Modifier Placement Rationale

There are several major driving forces at play:

* I use MacOS.
* I'm Danish so the Alt and Shift-Alt layers in MacOS simply have to work.
* I use Vim for coding.
* I use org-mode in Emacs to keep track of my time.

* Space is on the right hand side because I almost exclusively use my right hand thumb for
  space.
* Cmd is on the left since I often use Cmd+click to open a link in a new tab in Safari.
* Due to my usage of Vim Esc got a spot on the modifier row.
* Tab is on the right to enable easy navigation between winows with Cmd+Tab.
* Shift is on the left since org-mode uses Ctrl+arrows to manipulate task state quickly,
 and since the arrow keys are activated using Lower (which has been moved to the right) and S, E, T,
 and D, it works well that way. 
* Ctrl is on the right since Ctrl+<0-9> is used in MacOS to switch between spaces.
* Enter is on both sides since Enter is often used together with all of the modifiers. E.g.,
  Cmd+Enter to send mails in most situations, but Ctrl+Enter is used in Emacs to create a
  new task in org-mode.
 
This means that arrows and digits are being modified from the other hand, which could be
bad for gaming, so if you're into that you might want to re-think a few things, but in
that case you are probably using a Windows machine and then there are other constraints
you have to deal with.



A quantum/keymap_extras/keymap_norman.h => quantum/keymap_extras/keymap_norman.h +54 -0
@@ 0,0 1,54 @@

/* Copyright 2019 Torben Hoffmann
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#pragma once

#include "keymap.h"
// For software implementation of norman
#define NM_Q    KC_Q
#define NM_W    KC_W
#define NM_D    KC_E
#define NM_F    KC_R
#define NM_K    KC_T
#define NM_J    KC_Y
#define NM_U    KC_U
#define NM_R    KC_I
#define NM_L    KC_O
#define NM_SCLN KC_P
#define NM_COLN LSFT(NM_SCLN)

#define NM_A    KC_A
#define NM_S    KC_S
#define NM_E    KC_D
#define NM_T    KC_F
#define NM_G    KC_G
#define NM_Y    KC_H
#define NM_N    KC_J
#define NM_I    KC_K
#define NM_O    KC_L
#define NM_H    KC_SCLN

#define NM_Z    KC_Z
#define NM_X    KC_X
#define NM_C    KC_C
#define NM_V    KC_V
#define NM_B    KC_B
#define NM_P    KC_N
#define NM_M    KC_M
#define NM_COMM KC_COMM
#define NM_DOT  KC_DOT
#define NM_SLSH KC_SLSH


A quantum/keymap_extras/sendstring_norman.h => quantum/keymap_extras/sendstring_norman.h +39 -0
@@ 0,0 1,39 @@
/* Copyright 2019 Torben Hoffmann
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
/* Sendstring definitions for the Colemak layout */
#pragma once

#include "keymap_norman.h"

const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
    0, 0, 0, 0, 0, 0, 0, 0,
    KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, KC_ESC, 0, 0, 0, 0,
    KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
    KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
    KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
    KC_8, KC_9, NM_SCLN, NM_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
    KC_2, NM_A, NM_B, NM_C, NM_D, NM_E, NM_F, NM_G,
    NM_H, NM_I, NM_J, NM_K, NM_L, NM_M, NM_N, NM_O,
    NM_P, NM_Q, NM_R, NM_S, NM_T, NM_U, NM_V, NM_W,
    NM_X, NM_Y, NM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
    KC_GRV, NM_A, NM_B, NM_C, NM_D, NM_E, NM_F, NM_G,
    NM_H, NM_I, NM_J, NM_K, NM_L, NM_M, NM_N, NM_O,
    NM_P, NM_Q, NM_R, NM_S, NM_T, NM_U, NM_V, NM_W,
    NM_X, NM_Y, NM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
};