From 849ed5a6a03b14defa94a50b66169abac89b9c08 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sat, 13 May 2017 08:51:20 -0700 Subject: [PATCH 01/19] anti-ghost improvement for older keyboards with empty spots in matrix --- tmk_core/common/keyboard.c | 36 ++++++++++++++++++++++++++++++------ tmk_core/common/keyboard.h | 2 +- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index eac1f1dd8..93a066e57 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -64,20 +64,41 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST +static uint16_t matrix_ghost_check[MATRIX_ROWS]; static bool has_ghost_in_row(uint8_t row) { - matrix_row_t matrix_row = matrix_get_row(row); - // No ghost exists when less than 2 keys are down on the row - if (((matrix_row - 1) & matrix_row) == 0) + matrix_row_t matrix_row = (matrix_get_row(row) & matrix_ghost_check[row]); + /* No ghost exists when less than 2 keys are down on the row. + If there are "active" blanks in the matrix, the key can't be pressed by the user, + there is no doubt as to which keys are really being pressed. + The ghosts will be ignored, they are KC_NO. */ + if (((matrix_row - 1) & matrix_row) == 0){ return false; - - // Ghost occurs when the row shares column line with other row + } + // Ghost occurs when the row shares column line with other row, blanks in the matrix don't matter + // If there are more than two real keys pressed and they match another row's real keys, the row will be ignored. for (uint8_t i=0; i < MATRIX_ROWS; i++) { - if (i != row && (matrix_get_row(i) & matrix_row)) + if (i != row && __builtin_popcount((matrix_get_row(i) & matrix_ghost_check[i]) & matrix_row) > 1){ return true; + } } return false; + return false; } + +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +// bit map of true keys and empty spots in matrix, each row is reversed +void make_ghost_check_array(){ + for (int row = 0; row < MATRIX_ROWS; row++) { + for (int col = 0; col < MATRIX_COLS; col++) { + if (keymaps[0][row][col] & 0xFF) + matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 13:19:28 -0700 Subject: [PATCH 02/19] improvements --- tmk_core/common/keyboard.c | 39 ++++++++++++++++---------------------- tmk_core/common/keyboard.h | 1 - 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 93a066e57..116914e1a 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -62,12 +62,21 @@ along with this program. If not, see . #endif - #ifdef MATRIX_HAS_GHOST -static uint16_t matrix_ghost_check[MATRIX_ROWS]; +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +// bit map of true keys and empty spots in matrix, each row is reversed +static uint16_t get_row_ghost_check(uint16_t row){ + for (int col = 0; col < MATRIX_COLS; col++) { + if (keymaps[0][row][col]) + row &= 1< 1){ + if (i != row && __builtin_popcount( + get_row_ghost_check(matrix_get_row(i)) & matrix_row + ) > 1){ return true; } } return false; - return false; } - -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -// bit map of true keys and empty spots in matrix, each row is reversed -void make_ghost_check_array(){ - for (int row = 0; row < MATRIX_ROWS; row++) { - for (int col = 0; col < MATRIX_COLS; col++) { - if (keymaps[0][row][col] & 0xFF) - matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 16:57:23 -0700 Subject: [PATCH 03/19] a bit smaller --- tmk_core/common/keyboard.c | 59 ++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 116914e1a..d1794c887 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -63,40 +63,54 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST -extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -// bit map of true keys and empty spots in matrix, each row is reversed -static uint16_t get_row_ghost_check(uint16_t row){ - for (int col = 0; col < MATRIX_COLS; col++) { - if (keymaps[0][row][col]) - row &= 1< 1){ + return true; + } + return false; +} +static inline bool has_ghost_in_row(uint8_t row, uint16_t rowdata) +{ + rowdata &= matrix_ghost_check[row]; + if (((rowdata - 1) & rowdata) == 0){ + return false; + } /* No ghost exists when less than 2 keys are down on the row. If there are "active" blanks in the matrix, the key can't be pressed by the user, there is no doubt as to which keys are really being pressed. The ghosts will be ignored, they are KC_NO. */ - if (((matrix_row - 1) & matrix_row) == 0){ - return false; - } // Ghost occurs when the row shares column line with other row, blanks in the matrix don't matter - // If there are two or more real keys pressed and they match another row's real keys, the row will be ignored. + // If there are more than two real keys pressed and they match another row's real keys, the row will be ignored. for (uint8_t i=0; i < MATRIX_ROWS; i++) { - if (i != row && __builtin_popcount( - get_row_ghost_check(matrix_get_row(i)) & matrix_row - ) > 1){ + if (i != row && countones((matrix_get_row(i) & matrix_ghost_check[i]) & rowdata)){ return true; } } return false; } + +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +// bit map of true keys and empty spots in matrix, each row is reversed +static inline void make_ghost_check_array(void){ + for (int row = 0; row < MATRIX_ROWS; row++) { + for (int col = 0; col < MATRIX_COLS; col++) { + if (pgm_read_byte(&keymaps[0][row][col]) != 0) + matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 17:01:27 -0700 Subject: [PATCH 04/19] a bit smaller --- tmk_core/common/keyboard.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index d1794c887..0116053fb 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -161,7 +161,7 @@ void keyboard_task(void) { static matrix_row_t matrix_prev[MATRIX_ROWS]; #ifdef MATRIX_HAS_GHOST - static matrix_row_t matrix_ghost[MATRIX_ROWS]; + // static matrix_row_t matrix_ghost[MATRIX_ROWS]; #endif static uint8_t led_status = 0; matrix_row_t matrix_row = 0; @@ -178,13 +178,13 @@ void keyboard_task(void) * debugging. But don't update matrix_prev until un-ghosted, or * the last key would be lost. */ - if (debug_matrix && matrix_ghost[r] != matrix_row) { - matrix_print(); - } - matrix_ghost[r] = matrix_row; + //if (debug_matrix && matrix_ghost[r] != matrix_row) { + // matrix_print(); + //} + //matrix_ghost[r] = matrix_row; continue; } - matrix_ghost[r] = matrix_row; + //matrix_ghost[r] = matrix_row; #endif if (debug_matrix) matrix_print(); for (uint8_t c = 0; c < MATRIX_COLS; c++) { From 7b7e285a984a5bf1f7f38f1b5846811dfcb3a185 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sat, 13 May 2017 17:22:38 -0700 Subject: [PATCH 05/19] should be using matrix_row_t --- tmk_core/common/keyboard.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 0116053fb..24cc28892 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -63,9 +63,9 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST -static uint16_t matrix_ghost_check[MATRIX_ROWS]; +static matrix_row_t matrix_ghost_check[MATRIX_ROWS]; -static inline bool countones(uint16_t data) +static inline bool countones(matrix_row_t data) { int count = 0; for (int col = 0; col < MATRIX_COLS; col++) { @@ -77,7 +77,7 @@ static inline bool countones(uint16_t data) } return false; } -static inline bool has_ghost_in_row(uint8_t row, uint16_t rowdata) +static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) { rowdata &= matrix_ghost_check[row]; if (((rowdata - 1) & rowdata) == 0){ From 37f6f92765513cd66c92178f48785d492eb06b89 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sat, 13 May 2017 18:24:43 -0700 Subject: [PATCH 06/19] faster and less bits --- tmk_core/common/keyboard.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 24cc28892..d8b5dc403 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -63,14 +63,25 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST -static matrix_row_t matrix_ghost_check[MATRIX_ROWS]; +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ + matrix_row_t out = 0; + for (int col = 0; col < MATRIX_COLS; col++) { + if (pgm_read_byte(&keymaps[0][row][col]) && ((rowdata & (1< 1){ return true; @@ -79,7 +90,7 @@ static inline bool countones(matrix_row_t data) } static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) { - rowdata &= matrix_ghost_check[row]; + rowdata = get_real_keys(row, rowdata); if (((rowdata - 1) & rowdata) == 0){ return false; } @@ -90,24 +101,13 @@ static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) // Ghost occurs when the row shares column line with other row, blanks in the matrix don't matter // If there are more than two real keys pressed and they match another row's real keys, the row will be ignored. for (uint8_t i=0; i < MATRIX_ROWS; i++) { - if (i != row && countones((matrix_get_row(i) & matrix_ghost_check[i]) & rowdata)){ + if (i != row && countones(get_real_keys(i, matrix_get_row(i)) & rowdata)){ return true; } } return false; } -extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -// bit map of true keys and empty spots in matrix, each row is reversed -static inline void make_ghost_check_array(void){ - for (int row = 0; row < MATRIX_ROWS; row++) { - for (int col = 0; col < MATRIX_COLS; col++) { - if (pgm_read_byte(&keymaps[0][row][col]) != 0) - matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 19:07:05 -0700 Subject: [PATCH 07/19] faster and less bits... again --- tmk_core/common/keyboard.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index d8b5dc403..fa17ffca2 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -74,20 +74,19 @@ static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ return out; } - -static inline bool countones(matrix_row_t data) +static inline bool countones(matrix_row_t row) { int count = 0; - for (int col = 0; col < MATRIX_COLS; col++) { - if (data & (1< 0){ + count += 1; + row &= row-1; } if (count > 1){ return true; } return false; } + static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) { rowdata = get_real_keys(row, rowdata); From b9b2244b8275066d1226fba0fb75747a194f0553 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sun, 14 May 2017 08:01:01 -0700 Subject: [PATCH 08/19] faster, less bits :) --- tmk_core/common/keyboard.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index fa17ffca2..20b867285 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -76,15 +76,8 @@ static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ static inline bool countones(matrix_row_t row) { - int count = 0; - while (row > 0){ - count += 1; - row &= row-1; - } - if (count > 1){ - return true; - } - return false; + row &= row-1; + return row; } static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) From 84395e8a0427bcb51c4ef4ff24c7901d1fbb0764 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sun, 14 May 2017 09:36:50 -0700 Subject: [PATCH 09/19] whoops --- tmk_core/common/keyboard.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 20b867285..a3fe559f3 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -67,7 +67,7 @@ extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ matrix_row_t out = 0; for (int col = 0; col < MATRIX_COLS; col++) { - if (pgm_read_byte(&keymaps[0][row][col]) && ((rowdata & (1< Date: Sun, 14 May 2017 15:36:44 -0700 Subject: [PATCH 10/19] added comments and made function name clearer --- tmk_core/common/keyboard.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index a3fe559f3..97a8f1cd8 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -61,39 +61,45 @@ along with this program. If not, see . # include "visualizer/visualizer.h" #endif - #ifdef MATRIX_HAS_GHOST extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ matrix_row_t out = 0; - for (int col = 0; col < MATRIX_COLS; col++) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + //read each key in the row data and check if the keymap defines it as a real key if (pgm_read_byte(&keymaps[0][row][col]) && (rowdata & (1< Date: Tue, 16 May 2017 15:15:42 +0200 Subject: [PATCH 11/19] Created a dvorak keymap for Swedish developers using Visual Studio --- .../keymaps/dvorak_programmer_swe/keymap.c | 331 ++++++++++++++++++ .../keymaps/dvorak_programmer_swe/readme.md | 28 ++ 2 files changed, 359 insertions(+) create mode 100644 keyboards/ergodox/keymaps/dvorak_programmer_swe/keymap.c create mode 100644 keyboards/ergodox/keymaps/dvorak_programmer_swe/readme.md diff --git a/keyboards/ergodox/keymaps/dvorak_programmer_swe/keymap.c b/keyboards/ergodox/keymaps/dvorak_programmer_swe/keymap.c new file mode 100644 index 000000000..8d65f7c7a --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_programmer_swe/keymap.c @@ -0,0 +1,331 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" +#include "keymap_nordic.h" +#include "keymap_norwegian.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // mouse keys +#define DEVL 3 // dev keys + +#define MACRO_PUBLIC 10 +#define MACRO_PRIVATE 11 +#define MACRO_PROT 12 + +#define MACRO_SHARED 13 +#define MACRO_CONST 14 +#define MACRO_DIM 15 +#define MACRO_STRING 16 +#define MACRO_INT 17 +#define MACRO_DEC 18 +#define MACRO_BOOL 19 + +#define MACRO_RETURN 20 +#define MACRO_NOTHING 21 +#define MACRO_TODO 22 + +#define MACRO_SAVE 24 +#define MACRO_BUILD 25 +#define MACRO_DEBUG 26 + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | L3 | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | \ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | - | , | . | P | Y | LT1 | | LT1 | F | G | C | R | L | Å | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | WIN | A | O | E | U | I |------| |------| D | H | T | N | S | Ä | + * |--------+------+------+------+------+------| LT2 | | LT2 |------+------+------+------+------+--------| + * | LShift | Ö | Q | J | K | X | | | | B | M | W | V |Z/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | CTRL | L1 |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + MO(DEVL), KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, NO_MINS, KC_COMM, KC_DOT, KC_P, KC_Y, TG(SYMB), + KC_LGUI, KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, TG(MDIA), + CTL_T(KC_NO), MO(SYMB), LALT(KC_LSFT), KC_LEFT,KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLASH, + TG(1), KC_F, KC_G, KC_C, KC_R, KC_L, NO_AM, + KC_D, KC_H, KC_T, KC_N, KC_S, NO_AE, + TG(MDIA),KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | @ | { | } | [ | ] | | | | < | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | ( | ) | \ | / |------| |------| > | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | UND | CUT | COP | PAS | | | | ? | 1 | 2 | 3 | % | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | . | 0 | = | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, NO_AT, ALGR(KC_7), ALGR(KC_0), NO_LBRC, NO_RBRC, KC_TRNS, + KC_TRNS, KC_HASH, NO_LPRN, NO_RPRN, ALGR(KC_MINS), NO_SLSH, + KC_TRNS, KC_TRNS, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, NO_LESS, KC_7, KC_8, KC_9, KC_KP_ASTERISK, KC_F12, + LSFT(NO_LESS), KC_4, KC_5, KC_6, KC_KP_PLUS, KC_TRNS, + KC_TRNS, NO_QUES, KC_1, KC_2, KC_3, LSFT(KC_5), KC_TRNS, + KC_DOT,KC_0, LSFT(KC_0), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 3: Developer keys in vb.net + * shortened in layout beneth, for example int-> integer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | Save |Build |Debug | | | | | | bool | int |string| dec | Todo | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| priv | publ |shared| prot | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | const| dim |return|nothin| | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[DEVL] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(MACRO_SAVE), M(MACRO_BUILD), M(MACRO_DEBUG), KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, M(MACRO_BOOL), M(MACRO_INT), M(MACRO_STRING), M(MACRO_DEC), M(MACRO_TODO), KC_TRNS, + M(MACRO_PRIVATE), M(MACRO_PUBLIC), M(MACRO_SHARED), M(MACRO_PROT), KC_TRNS, KC_TRNS, + KC_TRNS, M(MACRO_CONST), M(MACRO_DIM), M(MACRO_RETURN), M(MACRO_NOTHING), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + case MACRO_PUBLIC: + if (record->event.pressed) { + return MACRO( T(P), T(U), T(B), T(L), T(I), T(C), T(SPACE),END); + } + break; + case MACRO_PRIVATE: + if (record->event.pressed) { + return MACRO( T(P), T(R), T(I), T(V), T(A), T(T), T(E), T(SPACE),END); + } + break; + case MACRO_PROT: + if (record->event.pressed) { + return MACRO( T(P), T(R), T(O), T(T), T(E), T(C), T(T), T(E), T(D), T(SPACE),END); + } + break; + case MACRO_SHARED: + if (record->event.pressed) { + return MACRO( T(S), T(H), T(A), T(R), T(E), T(D), T(SPACE), END); + } + break; + case MACRO_CONST: + if (record->event.pressed) { + return MACRO( T(C), T(O), T(N), T(S), T(T), T(SPACE), END); + } + break; + case MACRO_DIM: + if (record->event.pressed) { + return MACRO( T(D), T(I), T(M), T(SPACE), END); + } + break; + case MACRO_STRING: + if (record->event.pressed) { + return MACRO( T(S), T(T), T(R), T(I), T(N), T(G), T(SPACE), END); + } + break; + case MACRO_BOOL: + if (record->event.pressed) { + return MACRO( T(B), T(O), T(O), T(L), T(E), T(A), T(N), T(SPACE), END); + } + break; + case MACRO_INT: + if (record->event.pressed) { + return MACRO( T(I), T(N), T(T), T(SPACE), END); + } + break; + case MACRO_DEC: + if (record->event.pressed) { + return MACRO( T(D), T(E), T(C), T(I), T(M), T(A), T(L), T(SPACE), END); + } + break; + case MACRO_RETURN: + if (record->event.pressed) { + return MACRO( T(R), T(E), T(T), T(U),T(R),T(N), T(SPACE), END); + } + break; + case MACRO_NOTHING: + if (record->event.pressed) { + return MACRO( T(N), T(O), T(T), T(H), T(I), T(N), T(G), T(SPACE), END); + } + case MACRO_TODO: + if (record->event.pressed) { + return MACRO( KC_BSLASH, D(LSHIFT) ,T(T), T(O), T(D), T(O), KC_DOT, U(LSHIFT), T(SPACE),END); + } + break; + case MACRO_SAVE: + if (record->event.pressed) { + return MACRO( D(LCTL) ,T(S), U(LCTL),END); + } + break; + case MACRO_BUILD: + if (record->event.pressed) { + return MACRO( D(LCTL), D(LSHIFT) ,T(B), U(LSHIFT), U(LCTL),END); + } + break; + case MACRO_DEBUG: + if (record->event.pressed) { + return MACRO( KC_F5 ,END); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/dvorak_programmer_swe/readme.md b/keyboards/ergodox/keymaps/dvorak_programmer_swe/readme.md new file mode 100644 index 000000000..552fa0e3a --- /dev/null +++ b/keyboards/ergodox/keymaps/dvorak_programmer_swe/readme.md @@ -0,0 +1,28 @@ +# ErgoDox EZ Dvorak Programmer SWEDISH + +Dvorak layout adjusted for a suitable programmer layout and swedish special characters added: + +* åäö characters added +* Layout for common vb.net keywords +* Common Visual Studio commands like Save, Build, Debug + +TODO: + +* (Layer 4 is qwerty (for easier gaming & less fortunate keyboard users)) Like this idea, will add it later on + +Known issues: + +* Keymap 2 modifier has not gotten its place yet.. +* Print screen, where? + + +## Changelog + +* 2017-05-16 + * Initial release + +# Author +Christian Westerlund +cwesterlund @ github + +Thanks to the author of keymap csharp_dev for inspiration! \ No newline at end of file From 3c5b9150789fdd20b4dafb91463440010a6b6759 Mon Sep 17 00:00:00 2001 From: skullY Date: Fri, 21 Apr 2017 22:05:22 -0700 Subject: [PATCH 12/19] Make KC_GRV accessible --- keyboards/clueboard/keymaps/shift_fn/keymap.c | 2 +- keyboards/clueboard/keymaps/skully/keymap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/clueboard/keymaps/shift_fn/keymap.c b/keyboards/clueboard/keymaps/shift_fn/keymap.c index fdec37a54..83ae1d615 100644 --- a/keyboards/clueboard/keymaps/shift_fn/keymap.c +++ b/keyboards/clueboard/keymaps/shift_fn/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _FL: Function Layer */ [_FL] = KEYMAP( - S(KC_GRV), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_GRV), KC_DEL, BL_STEP, \ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_GRV), KC_DEL, BL_STEP, \ S(KC_TAB), S(KC_Q), S(KC_W),S(KC_E),S(KC_R),S(KC_T), S(KC_Y), S(KC_U),S(KC_I),S(KC_O), S(KC_P), S(KC_LBRC),S(KC_RBRC),S(KC_BSLS), S(KC_PGDN), \ S(KC_LCTL),S(KC_A), MO(_CL),S(KC_D),S(KC_F),S(KC_G), S(KC_H), S(KC_J),S(KC_K),S(KC_L), S(KC_SCLN),S(KC_QUOT),S(KC_NUHS),S(KC_ENT), \ MO(_FL), S(KC_NUBS),S(KC_Z),S(KC_X),S(KC_C),S(KC_V), S(KC_B), S(KC_N),S(KC_M),S(KC_COMM),S(KC_DOT), S(KC_SLSH),S(KC_RO), KC_RSFT, KC_PGUP, \ diff --git a/keyboards/clueboard/keymaps/skully/keymap.c b/keyboards/clueboard/keymaps/skully/keymap.c index df7757a92..47dee8e6d 100644 --- a/keyboards/clueboard/keymaps/skully/keymap.c +++ b/keyboards/clueboard/keymaps/skully/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _FL: Function Layer */ [_FL] = KEYMAP( - S(KC_GRV), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_GRV), KC_DEL, BL_STEP, \ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_GRV), KC_DEL, BL_STEP, \ S(KC_TAB), S(KC_Q), S(KC_W),S(KC_E),S(KC_R),S(KC_T), S(KC_Y), S(KC_U),S(KC_I),S(KC_O), S(KC_P), S(KC_LBRC),S(KC_RBRC),S(KC_BSLS), S(KC_PGDN), \ S(KC_LCTL),S(KC_A), MO(_CL),S(KC_D),S(KC_F),S(KC_G), S(KC_H), S(KC_J),S(KC_K),S(KC_L), S(KC_SCLN),S(KC_QUOT),S(KC_NUHS),S(KC_ENT), \ MO(_FL), S(KC_NUBS),S(KC_Z),S(KC_X),S(KC_C),S(KC_V), S(KC_B), S(KC_N),S(KC_M),S(KC_COMM),S(KC_DOT), S(KC_SLSH),S(KC_RO), KC_RSFT, KC_PGUP, \ From a74e69e9fa889113ee31fbc8dc7e6848fdb07576 Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 16 May 2017 13:09:23 -0700 Subject: [PATCH 13/19] Increase TAPPING_TERM for the Clueboard --- keyboards/clueboard/config.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/keyboards/clueboard/config.h b/keyboards/clueboard/config.h index ad6832385..381706277 100644 --- a/keyboards/clueboard/config.h +++ b/keyboards/clueboard/config.h @@ -42,6 +42,16 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* How long a "key tap" is. Used in functions like LT() and macros to determine + * how long QMK "holds down" a tapped key. + * + * If you are macOS this should be at least 500ms to avoid macOS's accidental + * Caps Lock activation prevention measures, as noted by /u/JerryEn here: + * + * https://www.reddit.com/r/clueboard/comments/6bfc2m/lt_not_working_with_caps_lock/dhmbp88/ + */ +#define TAPPING_TERM 600 // ms + /* * Feature disable options * These options are also useful to firmware size reduction. From 8da442f411a7fe0d9a5521ac6e95e20c7923caf1 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 17 May 2017 20:27:07 -0400 Subject: [PATCH 14/19] update travis script --- util/ergodox_ez.html | 1 - util/travis_compiled_push.sh | 13 +++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 util/ergodox_ez.html diff --git a/util/ergodox_ez.html b/util/ergodox_ez.html deleted file mode 100644 index 8e9286607..000000000 --- a/util/ergodox_ez.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/util/travis_compiled_push.sh b/util/travis_compiled_push.sh index 58334cb1f..718daaa29 100644 --- a/util/travis_compiled_push.sh +++ b/util/travis_compiled_push.sh @@ -33,18 +33,19 @@ if [[ "$TRAVIS_COMMIT_MESSAGE" != *"[skip build]"* ]] ; then make ergodox-ez AUTOGEN=true - find . -name ".build" | xargs rm -rf cd .. git clone https://$GH_TOKEN@github.com/jackhumbert/qmk.fm.git cd qmk.fm - git submodule update --init --recursive + #git submodule update --init --recursive #rm -rf keyboard #rm -rf keyboards - yes | cp -rf ../qmk_firmware/keyboards . + #yes | cp -rf ../qmk_firmware/keyboards . #mkdir keyboards/ergodox_ez/ - cp ../qmk_firmware/util/ergodox_ez.html keyboards/ergodox_ez/index.html - cp ../qmk_firmware/readme.md qmk_readme.md - ./generate.sh + #cp ../qmk_firmware/util/ergodox_ez.html keyboards/ergodox_ez/index.html + #cp ../qmk_firmware/readme.md qmk_readme.md + #./generate.sh + rm -f _compiled/*.hex + for file in ../qmk_firmware/keyboards/*/keymaps/*/*.hex; do mv -v "$file" "_compiled/${file##*/}"; done git add -A git commit -m "generated from qmk/qmk_firmware@${rev}" From aaa01d0a4e633e26c58e5bc9c0bc557604088140 Mon Sep 17 00:00:00 2001 From: tengg Date: Wed, 17 May 2017 21:20:01 -0400 Subject: [PATCH 15/19] ESC/GRAVE/TILDE better handling (#1307) * revise HHKB bootloader_size to 4096 such that sw reset works * cleanup esr/grave/tilde handling function --- .../clueboard/keymaps/mac_optimized/keymap.c | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/keyboards/clueboard/keymaps/mac_optimized/keymap.c b/keyboards/clueboard/keymaps/mac_optimized/keymap.c index 7ea02d27e..e72733092 100644 --- a/keyboards/clueboard/keymaps/mac_optimized/keymap.c +++ b/keyboards/clueboard/keymaps/mac_optimized/keymap.c @@ -50,35 +50,28 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; - static bool mod_flag; switch (id) { case 0: /* Handle the combined Grave/Esc key */ - mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed - if (record->event.pressed) { /* The key is being pressed. */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed if (mods_pressed) { - mod_flag = true; - add_key(KC_GRV); - send_keyboard_report(); + register_code(KC_GRV); } else { - add_key(KC_ESC); - send_keyboard_report(); + register_code(KC_ESC); } } else { /* The key is being released. */ - if (mod_flag) { - mod_flag = false; - del_key(KC_GRV); - send_keyboard_report(); + if (mods_pressed) { + mods_pressed = false; + unregister_code(KC_GRV); } else { - del_key(KC_ESC); - send_keyboard_report(); + unregister_code(KC_ESC); } } break; From 85df6873487000583454657fb20ac7cea7194f8d Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 18 May 2017 18:55:07 -0400 Subject: [PATCH 16/19] m10a lowercase --- keyboards/{M10A => m10a}/Makefile | 0 keyboards/{M10A => m10a}/config.h | 0 keyboards/{M10A => m10a}/keymaps/default/Makefile | 0 keyboards/{M10A => m10a}/keymaps/default/keymap.c | 2 +- keyboards/{M10A/M10A.c => m10a/m10a.c} | 2 +- keyboards/{M10A/M10A.h => m10a/m10a.h} | 0 keyboards/{M10A => m10a}/rules.mk | 0 7 files changed, 2 insertions(+), 2 deletions(-) rename keyboards/{M10A => m10a}/Makefile (100%) rename keyboards/{M10A => m10a}/config.h (100%) rename keyboards/{M10A => m10a}/keymaps/default/Makefile (100%) rename keyboards/{M10A => m10a}/keymaps/default/keymap.c (99%) rename keyboards/{M10A/M10A.c => m10a/m10a.c} (72%) rename keyboards/{M10A/M10A.h => m10a/m10a.h} (100%) rename keyboards/{M10A => m10a}/rules.mk (100%) diff --git a/keyboards/M10A/Makefile b/keyboards/m10a/Makefile similarity index 100% rename from keyboards/M10A/Makefile rename to keyboards/m10a/Makefile diff --git a/keyboards/M10A/config.h b/keyboards/m10a/config.h similarity index 100% rename from keyboards/M10A/config.h rename to keyboards/m10a/config.h diff --git a/keyboards/M10A/keymaps/default/Makefile b/keyboards/m10a/keymaps/default/Makefile similarity index 100% rename from keyboards/M10A/keymaps/default/Makefile rename to keyboards/m10a/keymaps/default/Makefile diff --git a/keyboards/M10A/keymaps/default/keymap.c b/keyboards/m10a/keymaps/default/keymap.c similarity index 99% rename from keyboards/M10A/keymaps/default/keymap.c rename to keyboards/m10a/keymaps/default/keymap.c index 75abeb5b7..97434a461 100644 --- a/keyboards/M10A/keymaps/default/keymap.c +++ b/keyboards/m10a/keymaps/default/keymap.c @@ -1,7 +1,7 @@ // This is the canonical layout file for the Quantum project. If you want to add another keyboard, // this is the style you want to emulate. -#include "M10A.h" +#include "m10a.h" #include "action_layer.h" #include "eeconfig.h" diff --git a/keyboards/M10A/M10A.c b/keyboards/m10a/m10a.c similarity index 72% rename from keyboards/M10A/M10A.c rename to keyboards/m10a/m10a.c index 9a3bd15e1..9cc7f069a 100644 --- a/keyboards/M10A/M10A.c +++ b/keyboards/m10a/m10a.c @@ -1,4 +1,4 @@ -#include "M10A.h" +#include "m10a.h" void matrix_init_kb(void) { matrix_init_user(); diff --git a/keyboards/M10A/M10A.h b/keyboards/m10a/m10a.h similarity index 100% rename from keyboards/M10A/M10A.h rename to keyboards/m10a/m10a.h diff --git a/keyboards/M10A/rules.mk b/keyboards/m10a/rules.mk similarity index 100% rename from keyboards/M10A/rules.mk rename to keyboards/m10a/rules.mk From 9c284786e728a2e8834745d6bb7df0fda4099cf3 Mon Sep 17 00:00:00 2001 From: jerryen Date: Fri, 19 May 2017 17:24:47 -0700 Subject: [PATCH 17/19] Workaround for the macOS caps lock delay (#1308) * Add 80ms delay for KC_CAPS when used as a tap key Workaround for the macOS caps lock delay * Revert "Increase TAPPING_TERM for the Clueboard" This reverts commit a74e69e9fa889113ee31fbc8dc7e6848fdb07576. --- keyboards/clueboard/config.h | 10 ---------- tmk_core/common/action.c | 4 ++++ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/keyboards/clueboard/config.h b/keyboards/clueboard/config.h index 381706277..ad6832385 100644 --- a/keyboards/clueboard/config.h +++ b/keyboards/clueboard/config.h @@ -42,16 +42,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* How long a "key tap" is. Used in functions like LT() and macros to determine - * how long QMK "holds down" a tapped key. - * - * If you are macOS this should be at least 500ms to avoid macOS's accidental - * Caps Lock activation prevention measures, as noted by /u/JerryEn here: - * - * https://www.reddit.com/r/clueboard/comments/6bfc2m/lt_not_working_with_caps_lock/dhmbp88/ - */ -#define TAPPING_TERM 600 // ms - /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 8640dfab3..a534f818e 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -26,6 +26,7 @@ along with this program. If not, see . #include "action_macro.h" #include "action_util.h" #include "action.h" +#include "wait.h" #ifdef DEBUG_ACTION #include "debug.h" @@ -438,6 +439,9 @@ void process_action(keyrecord_t *record, action_t action) } else { if (tap_count > 0) { dprint("KEYMAP_TAP_KEY: Tap: unregister_code\n"); + if (action.layer_tap.code == KC_CAPS) { + wait_ms(80); + } unregister_code(action.layer_tap.code); } else { dprint("KEYMAP_TAP_KEY: No tap: Off on release\n"); From d380ed1f7562995bc4260dfe3a16ddd9eb5a472f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 20 May 2017 12:37:31 -0400 Subject: [PATCH 18/19] Update readme.md --- readme.md | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/readme.md b/readme.md index cb12a2117..4db9fc828 100644 --- a/readme.md +++ b/readme.md @@ -1,18 +1,21 @@ # Quantum Mechanical Keyboard Firmware -[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) [![Gitter](https://badges.gitter.im/qmk/qmk_firmware.svg)](https://gitter.im/qmk/qmk_firmware?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) +[![Gitter](https://img.shields.io/gitter/room/qmk/qmk_firmware.js.svg)](https://gitter.im/qmk/qmk_firmware) +[![Docs Status](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm) +[![GitHub contributors](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly) +[![GitHub forks](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/) -This is a keyboard firmware based on the [tmk\_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). +This is a keyboard firmware based on the [tmk\_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR and ARM controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). -## Official website \(currently under construction with the move to the wiki\) +## Official website -For an easy-to-read version of this document and the repository, check out [http://qmk.fm](http://qmk.fm). Nicely formatted keyboard and keymap listings are also available there, along with the ability to download .hex files instead of having to setup a build environment and compile them. +[http://qmk.fm](http://qmk.fm) is the official website of QMK, where you can find links to this page, the documentation, and the keyboards supported by QMK. -## Included Keyboards +## Supported Keyboards * [Planck](/keyboards/planck/) * [Preonic](/keyboards/preonic/) -* [Atomic](/keyboards/atomic/) * [ErgoDox EZ](/keyboards/ergodox/) * [Clueboard](/keyboards/clueboard/) * [Cluepad](/keyboards/cluepad/) @@ -21,22 +24,8 @@ The project also includes community support for [lots of other keyboards](/keybo ## Maintainers -QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, [Hasu](https://github.com/tmk). This repo used to be a fork of [TMK](https://github.com/tmk/tmk_keyboard), and we are incredibly grateful for his founding contributions to the firmware. We've had to break the fork due to purely technical reasons - it simply became too different over time, and we've had to start refactoring some of the basic bits and pieces. We are huge fans of TMK and Hasu :\) - -This documentation is edited and maintained by Erez Zukerman of ErgoDox EZ. If you spot any typos or inaccuracies, please [open an issue](https://github.com/qmk/qmk_firmware/issues/new). - -The OLKB product firmwares are maintained by [Jack Humbert](https://github.com/jackhumbert), the Ergodox EZ by [Erez Zukerman](https://github.com/ezuk), and the Clueboard by [Zach White](https://github.com/skullydazed). - -## Documentation roadmap - -This is not a tiny project. While this is the main readme, there are many other files you might want to consult. Here are some points of interest: - -* [**The Wiki**](https://github.com/qmk/qmk_firmware/wiki) - the entire readme has been moved here -* The readme for your own keyboard: This is found under `keyboards//`. So for the ErgoDox, it's [here](keyboards/ergodox/); for the Planck, it's [here](keyboards/planck/) and so on. -* The list of possible keycodes you can use in your keymap is actually spread out in a few different places: - * [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes. - * [quantum/quantum\_keycodes.h](quantum/quantum_keycodes.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `quantum_keycodes.h` is where they're actually defined. -* The [TMK documentation](doc/TMK_README.md). QMK is based on TMK, and this explains how it works internally. - +QMK is developed and maintained by Jack Humbert of OLKB with contributions from the community, and of course, [Hasu](https://github.com/tmk). The OLKB product firmwares are maintained by [Jack Humbert](https://github.com/jackhumbert), the Ergodox EZ by [Erez Zukerman](https://github.com/ezuk), and the Clueboard by [Zach White](https://github.com/skullydazed). +## Documentation +[Documentation](https://docs.qmk.fm) is hosted on [Gitbook](https://www.gitbook.com/book/qmk/firmware/details) and [Github](https://github.com/qmk/qmk_firmware_docs/) (they are synced). You can request changes by making a fork and [pull request](https://github.com/qmk/qmk_firmware_docs/pulls), or by clicking the "suggest an edit" link on any page of docs.qmk.fm. From c7e9e643fa411266dfb9b08831967d29426b29bc Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 20 May 2017 12:38:30 -0400 Subject: [PATCH 19/19] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 4db9fc828..6db2f8d9f 100644 --- a/readme.md +++ b/readme.md @@ -28,4 +28,4 @@ QMK is developed and maintained by Jack Humbert of OLKB with contributions from ## Documentation -[Documentation](https://docs.qmk.fm) is hosted on [Gitbook](https://www.gitbook.com/book/qmk/firmware/details) and [Github](https://github.com/qmk/qmk_firmware_docs/) (they are synced). You can request changes by making a fork and [pull request](https://github.com/qmk/qmk_firmware_docs/pulls), or by clicking the "suggest an edit" link on any page of docs.qmk.fm. +[https://docs.qmk.fm](https://docs.qmk.fm) is hosted on [Gitbook](https://www.gitbook.com/book/qmk/firmware/details) and [Github](https://github.com/qmk/qmk_firmware_docs/) (they are synced). You can request changes by making a fork and [pull request](https://github.com/qmk/qmk_firmware_docs/pulls), or by clicking the "suggest an edit" link on any page of the Docs.