├── Firmware Files ├── Version 0.9.0 │ ├── readme.md │ ├── Left Hand │ │ ├── key.txt │ │ ├── aliases.c │ │ ├── combos.txt │ │ └── combos.c │ └── Right Hand │ │ ├── key.txt │ │ ├── aliases.c │ │ ├── combos.txt │ │ └── combos.c ├── mirror_a_layout.R ├── Version 0.8.1 │ └── Right Hand │ │ ├── key.txt │ │ ├── aliases.c │ │ ├── combos.txt │ │ ├── processor.R │ │ └── combos.c ├── keymap.c └── processor.R ├── README.md ├── LICENSE-APACHE-2.0.txt └── LICENSE-CC-Attribution-NonCommercial-ShareAlike-4.0-International.txt /Firmware Files/Version 0.9.0/readme.md: -------------------------------------------------------------------------------- 1 | # Version 0.9.0 2 | 3 | ## Flavors 4 | 5 | |Folder Name|Description| 6 | |---|---| 7 | |Right Hand|Standard Right-Handed ARTSEY| -------------------------------------------------------------------------------- /Firmware Files/mirror_a_layout.R: -------------------------------------------------------------------------------- 1 | library(mgsub) 2 | library(stringr) 3 | key<-readLines("key.txt") 4 | 5 | 6 | 7 | key <- unlist(lapply(key, 8 | mgsub, 9 | pattern=c("1_1","1_2","1_3","1_4","2_1","2_2","2_3","2_4"), 10 | replacement=c("1_4","1_3","1_2","1_1","2_4","2_3","2_2","2_1"), 11 | )) 12 | 13 | 14 | 15 | key <- paste0(key,collapse="\n") 16 | 17 | sink("left_key.txt") 18 | cat(key) 19 | sink() 20 | 21 | 22 | key<-readLines("combos.txt") 23 | 24 | key <- unlist(lapply(key, 25 | mgsub, 26 | pattern=c("1_1","1_2","1_3","1_4","2_1","2_2","2_3","2_4"), 27 | replacement=c("1_4","1_3","1_2","1_1","2_4","2_3","2_2","2_1"), 28 | )) 29 | 30 | key <- paste0(key,collapse="\n") 31 | 32 | sink("left_combos.txt") 33 | cat(key) 34 | sink() -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Left Hand/key.txt: -------------------------------------------------------------------------------- 1 | BASE_1_4||LT(_ART_SYM,KC_A) 2 | BASE_1_3||KC_R 3 | BASE_1_2||KC_T 4 | BASE_1_1||LT(_ART_NUM,KC_S) 5 | BASE_2_4||LT(_ART_PUNC,KC_E) 6 | BASE_2_3||KC_Y 7 | BASE_2_2||KC_I 8 | BASE_2_1||LT(_ART_CUS,KC_O) 9 | NUM_1_4||KC_1 10 | NUM_1_3||KC_2 11 | NUM_1_2||KC_3 12 | NUM_1_1||KC_TRNS 13 | NUM_2_4||KC_4 14 | NUM_2_3||KC_5 15 | NUM_2_2||KC_6 16 | NUM_2_1||KC_TRNS 17 | PUNC_1_4||KC_HASH 18 | PUNC_1_3||KC_GRV 19 | PUNC_1_2||KC_SCLN 20 | PUNC_1_1||KC_BSLS 21 | PUNC_2_4||KC_TRNS 22 | PUNC_2_3||KC_AT 23 | PUNC_2_2||KC_MINS 24 | PUNC_2_1||KC_EQL 25 | CUS_1_4||KC_MPLY 26 | CUS_1_3||KC_MUTE 27 | CUS_1_2||KC_VOLU 28 | CUS_1_1||KC_TRNS 29 | CUS_2_4||KC_MNXT 30 | CUS_2_3||KC_MPRV 31 | CUS_2_2||KC_VOLD 32 | CUS_2_1||KC_TRNS 33 | SYM_1_4||KC_TRNS 34 | SYM_1_3||KC_LPRN 35 | SYM_1_2||KC_LBRC 36 | SYM_1_1||KC_LCBR 37 | SYM_2_4||KC_TRNS 38 | SYM_2_3||KC_RPRN 39 | SYM_2_2||KC_RBRC 40 | SYM_2_1||KC_RCBR 41 | MOU_1_4||KC_BTN1 42 | MOU_1_3||KC_MS_U 43 | MOU_1_2||KC_BTN2 44 | MOU_1_1||KC_WH_U 45 | MOU_2_4||KC_MS_R 46 | MOU_2_3||KC_MS_D 47 | MOU_2_2||KC_MS_L 48 | MOU_2_1||KC_WH_D 49 | NAV_1_4||KC_END 50 | NAV_1_3||KC_UP 51 | NAV_1_2||KC_HOME 52 | NAV_1_1||KC_PGUP 53 | NAV_2_4||KC_RIGHT 54 | NAV_2_3||KC_DOWN 55 | NAV_2_2||KC_LEFT 56 | NAV_2_1||KC_PGDN -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Right Hand/key.txt: -------------------------------------------------------------------------------- 1 | BASE_1_1||LT(_ART_SYM,KC_A) 2 | BASE_1_2||KC_R 3 | BASE_1_3||KC_T 4 | BASE_1_4||LT(_ART_NUM,KC_S) 5 | BASE_2_1||LT(_ART_PUNC,KC_E) 6 | BASE_2_2||KC_Y 7 | BASE_2_3||KC_I 8 | BASE_2_4||LT(_ART_CUS,KC_O) 9 | NUM_1_1||KC_1 10 | NUM_1_2||KC_2 11 | NUM_1_3||KC_3 12 | NUM_1_4||KC_TRNS 13 | NUM_2_1||KC_4 14 | NUM_2_2||KC_5 15 | NUM_2_3||KC_6 16 | NUM_2_4||KC_TRNS 17 | PUNC_1_1||KC_HASH 18 | PUNC_1_2||KC_GRV 19 | PUNC_1_3||KC_SCLN 20 | PUNC_1_4||KC_BSLS 21 | PUNC_2_1||KC_TRNS 22 | PUNC_2_2||KC_AT 23 | PUNC_2_3||KC_MINS 24 | PUNC_2_4||KC_EQL 25 | CUS_1_1||KC_MPLY 26 | CUS_1_2||KC_MUTE 27 | CUS_1_3||KC_VOLU 28 | CUS_1_4||KC_TRNS 29 | CUS_2_1||KC_MPRV 30 | CUS_2_2||KC_MNXT 31 | CUS_2_3||KC_VOLD 32 | CUS_2_4||KC_TRNS 33 | SYM_1_1||KC_TRNS 34 | SYM_1_2||KC_LPRN 35 | SYM_1_3||KC_LBRC 36 | SYM_1_4||KC_LCBR 37 | SYM_2_1||KC_TRNS 38 | SYM_2_2||KC_RPRN 39 | SYM_2_3||KC_RBRC 40 | SYM_2_4||KC_RCBR 41 | MOU_1_1||KC_BTN1 42 | MOU_1_2||KC_MS_U 43 | MOU_1_3||KC_BTN2 44 | MOU_1_4||KC_WH_U 45 | MOU_2_1||KC_MS_L 46 | MOU_2_2||KC_MS_D 47 | MOU_2_3||KC_MS_R 48 | MOU_2_4||KC_WH_D 49 | NAV_1_1||KC_HOME 50 | NAV_1_2||KC_UP 51 | NAV_1_3||KC_END 52 | NAV_1_4||KC_PGUP 53 | NAV_2_1||KC_LEFT 54 | NAV_2_2||KC_DOWN 55 | NAV_2_3||KC_RIGHT 56 | NAV_2_4||KC_PGDN 57 | -------------------------------------------------------------------------------- /Firmware Files/Version 0.8.1/Right Hand/key.txt: -------------------------------------------------------------------------------- 1 | BASE_1_1||LT(_ART_SYM,KC_A) 2 | BASE_1_2||KC_R 3 | BASE_1_3||KC_T 4 | BASE_1_4||LT(_ART_NUM,KC_S) 5 | BASE_2_1||LT(_ART_PUNC,KC_E) 6 | BASE_2_2||KC_Y 7 | BASE_2_3||KC_I 8 | BASE_2_4||LT(_ART_CUS,KC_O) 9 | NUM_1_1||KC_1 10 | NUM_1_2||KC_2 11 | NUM_1_3||KC_3 12 | NUM_1_4||KC_TRNS 13 | NUM_2_1||KC_4 14 | NUM_2_2||KC_5 15 | NUM_2_3||KC_6 16 | NUM_2_4||KC_TRNS 17 | PUNC_1_1||KC_EXLM 18 | PUNC_1_2||KC_BSLS 19 | PUNC_1_3||KC_SCLN 20 | PUNC_1_4||KC_GRV 21 | PUNC_2_1||KC_TRNS 22 | PUNC_2_2||KC_QUES 23 | PUNC_2_3||KC_MINS 24 | PUNC_2_4||KC_EQL 25 | CUS_1_1||KC_MPLY 26 | CUS_1_2||KC_MUTE 27 | CUS_1_3||KC_KB_VOLUME_UP 28 | CUS_1_4||KC_TRNS 29 | CUS_2_1||KC_MPRV 30 | CUS_2_2||KC_MNXT 31 | CUS_2_3||KC_KB_VOLUME_DOWN 32 | CUS_2_4||KC_TRNS 33 | SYM_1_1||KC_TRNS 34 | SYM_1_2||KC_LPRN 35 | SYM_1_3||KC_RPRN 36 | SYM_1_4||KC_LCBR 37 | SYM_2_1||KC_TRNS 38 | SYM_2_2||KC_LBRC 39 | SYM_2_3||KC_RBRC 40 | SYM_2_4||KC_RCBR 41 | MOU_1_1||KC_BTN1 42 | MOU_1_2||KC_MS_U 43 | MOU_1_3||KC_BTN2 44 | MOU_1_4||KC_WH_U 45 | MOU_2_1||KC_MS_L 46 | MOU_2_2||KC_MS_D 47 | MOU_2_3||KC_MS_R 48 | MOU_2_4||KC_WH_D 49 | NAV_1_1||KC_HOME 50 | NAV_1_2||KC_UP 51 | NAV_1_3||KC_END 52 | NAV_1_4||KC_PGUP 53 | NAV_2_1||KC_LEFT 54 | NAV_2_2||KC_DOWN 55 | NAV_2_3||KC_RIGHT 56 | NAV_2_4||KC_PGDN 57 | -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Left Hand/aliases.c: -------------------------------------------------------------------------------- 1 | #define BASE_1_4 LT(_ART_SYM,KC_A) 2 | #define BASE_1_3 KC_R 3 | #define BASE_1_2 KC_T 4 | #define BASE_1_1 LT(_ART_NUM,KC_S) 5 | #define BASE_2_4 LT(_ART_PUNC,KC_E) 6 | #define BASE_2_3 KC_Y 7 | #define BASE_2_2 KC_I 8 | #define BASE_2_1 LT(_ART_CUS,KC_O) 9 | #define NUM_1_4 KC_1 10 | #define NUM_1_3 KC_2 11 | #define NUM_1_2 KC_3 12 | #define NUM_1_1 KC_TRNS 13 | #define NUM_2_4 KC_4 14 | #define NUM_2_3 KC_5 15 | #define NUM_2_2 KC_6 16 | #define NUM_2_1 KC_TRNS 17 | #define PUNC_1_4 KC_HASH 18 | #define PUNC_1_3 KC_GRV 19 | #define PUNC_1_2 KC_SCLN 20 | #define PUNC_1_1 KC_BSLS 21 | #define PUNC_2_4 KC_TRNS 22 | #define PUNC_2_3 KC_AT 23 | #define PUNC_2_2 KC_MINS 24 | #define PUNC_2_1 KC_EQL 25 | #define CUS_1_4 KC_MPLY 26 | #define CUS_1_3 KC_MUTE 27 | #define CUS_1_2 KC_VOLU 28 | #define CUS_1_1 KC_TRNS 29 | #define CUS_2_4 KC_MNXT 30 | #define CUS_2_3 KC_MPRV 31 | #define CUS_2_2 KC_VOLD 32 | #define CUS_2_1 KC_TRNS 33 | #define SYM_1_4 KC_TRNS 34 | #define SYM_1_3 KC_LPRN 35 | #define SYM_1_2 KC_LBRC 36 | #define SYM_1_1 KC_LCBR 37 | #define SYM_2_4 KC_TRNS 38 | #define SYM_2_3 KC_RPRN 39 | #define SYM_2_2 KC_RBRC 40 | #define SYM_2_1 KC_RCBR 41 | #define MOU_1_4 KC_BTN1 42 | #define MOU_1_3 KC_MS_U 43 | #define MOU_1_2 KC_BTN2 44 | #define MOU_1_1 KC_WH_U 45 | #define MOU_2_4 KC_MS_R 46 | #define MOU_2_3 KC_MS_D 47 | #define MOU_2_2 KC_MS_L 48 | #define MOU_2_1 KC_WH_D 49 | #define NAV_1_4 KC_END 50 | #define NAV_1_3 KC_UP 51 | #define NAV_1_2 KC_HOME 52 | #define NAV_1_1 KC_PGUP 53 | #define NAV_2_4 KC_RIGHT 54 | #define NAV_2_3 KC_DOWN 55 | #define NAV_2_2 KC_LEFT 56 | #define NAV_2_1 KC_PGDN -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Right Hand/aliases.c: -------------------------------------------------------------------------------- 1 | #define BASE_1_1 LT(_ART_SYM,KC_A) 2 | #define BASE_1_2 KC_R 3 | #define BASE_1_3 KC_T 4 | #define BASE_1_4 LT(_ART_NUM,KC_S) 5 | #define BASE_2_1 LT(_ART_PUNC,KC_E) 6 | #define BASE_2_2 KC_Y 7 | #define BASE_2_3 KC_I 8 | #define BASE_2_4 LT(_ART_CUS,KC_O) 9 | #define NUM_1_1 KC_1 10 | #define NUM_1_2 KC_2 11 | #define NUM_1_3 KC_3 12 | #define NUM_1_4 KC_TRNS 13 | #define NUM_2_1 KC_4 14 | #define NUM_2_2 KC_5 15 | #define NUM_2_3 KC_6 16 | #define NUM_2_4 KC_TRNS 17 | #define PUNC_1_1 KC_HASH 18 | #define PUNC_1_2 KC_GRV 19 | #define PUNC_1_3 KC_SCLN 20 | #define PUNC_1_4 KC_BSLS 21 | #define PUNC_2_1 KC_TRNS 22 | #define PUNC_2_2 KC_AT 23 | #define PUNC_2_3 KC_MINS 24 | #define PUNC_2_4 KC_EQL 25 | #define CUS_1_1 KC_MPLY 26 | #define CUS_1_2 KC_MUTE 27 | #define CUS_1_3 KC_VOLU 28 | #define CUS_1_4 KC_TRNS 29 | #define CUS_2_1 KC_MPRV 30 | #define CUS_2_2 KC_MNXT 31 | #define CUS_2_3 KC_VOLD 32 | #define CUS_2_4 KC_TRNS 33 | #define SYM_1_1 KC_TRNS 34 | #define SYM_1_2 KC_LPRN 35 | #define SYM_1_3 KC_LBRC 36 | #define SYM_1_4 KC_LCBR 37 | #define SYM_2_1 KC_TRNS 38 | #define SYM_2_2 KC_RPRN 39 | #define SYM_2_3 KC_RBRC 40 | #define SYM_2_4 KC_RCBR 41 | #define MOU_1_1 KC_BTN1 42 | #define MOU_1_2 KC_MS_U 43 | #define MOU_1_3 KC_BTN2 44 | #define MOU_1_4 KC_WH_U 45 | #define MOU_2_1 KC_MS_L 46 | #define MOU_2_2 KC_MS_D 47 | #define MOU_2_3 KC_MS_R 48 | #define MOU_2_4 KC_WH_D 49 | #define NAV_1_1 KC_HOME 50 | #define NAV_1_2 KC_UP 51 | #define NAV_1_3 KC_END 52 | #define NAV_1_4 KC_PGUP 53 | #define NAV_2_1 KC_LEFT 54 | #define NAV_2_2 KC_DOWN 55 | #define NAV_2_3 KC_RIGHT 56 | #define NAV_2_4 KC_PGDN -------------------------------------------------------------------------------- /Firmware Files/Version 0.8.1/Right Hand/aliases.c: -------------------------------------------------------------------------------- 1 | #define BASE_1_1 LT(_ART_SYM,KC_A) 2 | #define BASE_1_2 KC_R 3 | #define BASE_1_3 KC_T 4 | #define BASE_1_4 LT(_ART_NUM,KC_S) 5 | #define BASE_2_1 LT(_ART_PUNC,KC_E) 6 | #define BASE_2_2 KC_Y 7 | #define BASE_2_3 KC_I 8 | #define BASE_2_4 LT(_ART_CUS,KC_O) 9 | #define NUM_1_1 KC_1 10 | #define NUM_1_2 KC_2 11 | #define NUM_1_3 KC_3 12 | #define NUM_1_4 KC_TRNS 13 | #define NUM_2_1 KC_4 14 | #define NUM_2_2 KC_5 15 | #define NUM_2_3 KC_6 16 | #define NUM_2_4 KC_TRNS 17 | #define PUNC_1_1 KC_EXLM 18 | #define PUNC_1_2 KC_BSLS 19 | #define PUNC_1_3 KC_SCLN 20 | #define PUNC_1_4 KC_GRV 21 | #define PUNC_2_1 KC_TRNS 22 | #define PUNC_2_2 KC_QUES 23 | #define PUNC_2_3 KC_MINS 24 | #define PUNC_2_4 KC_EQL 25 | #define CUS_1_1 KC_MPLY 26 | #define CUS_1_2 KC_MUTE 27 | #define CUS_1_3 KC_KB_VOLUME_UP 28 | #define CUS_1_4 KC_TRNS 29 | #define CUS_2_1 KC_MPRV 30 | #define CUS_2_2 KC_MNXT 31 | #define CUS_2_3 KC_KB_VOLUME_DOWN 32 | #define CUS_2_4 KC_TRNS 33 | #define SYM_1_1 KC_TRNS 34 | #define SYM_1_2 KC_LPRN 35 | #define SYM_1_3 KC_RPRN 36 | #define SYM_1_4 KC_LCBR 37 | #define SYM_2_1 KC_TRNS 38 | #define SYM_2_2 KC_LBRC 39 | #define SYM_2_3 KC_RBRC 40 | #define SYM_2_4 KC_RCBR 41 | #define MOU_1_1 KC_BTN1 42 | #define MOU_1_2 KC_MS_U 43 | #define MOU_1_3 KC_BTN2 44 | #define MOU_1_4 KC_WH_U 45 | #define MOU_2_1 KC_MS_L 46 | #define MOU_2_2 KC_MS_D 47 | #define MOU_2_3 KC_MS_R 48 | #define MOU_2_4 KC_WH_D 49 | #define NAV_1_1 KC_HOME 50 | #define NAV_1_2 KC_UP 51 | #define NAV_1_3 KC_END 52 | #define NAV_1_4 KC_PGUP 53 | #define NAV_2_1 KC_LEFT 54 | #define NAV_2_2 KC_DOWN 55 | #define NAV_2_3 KC_RIGHT 56 | #define NAV_2_4 KC_PGDN -------------------------------------------------------------------------------- /Firmware Files/keymap.c: -------------------------------------------------------------------------------- 1 | // Copyright 2023 QMK 2 | // SPDX-License-Identifier: GPL-2.0-or-later 3 | 4 | #include QMK_KEYBOARD_H 5 | 6 | enum layers { 7 | _ART_BASE, 8 | _ART_NUM, 9 | _ART_CUS, 10 | _ART_PUNC, 11 | _ART_MOU, 12 | _ART_NAV, 13 | _ART_SYM, 14 | }; 15 | 16 | #include "aliases.c" 17 | #include "combos.c" 18 | 19 | // copied from https://beta.docs.qmk.fm/faqs/faq_debug#which-matrix-position-is-this-keypress 20 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { 21 | // If console is enabled, it will print the matrix position and status of each key pressed 22 | #ifdef CONSOLE_ENABLE 23 | uprintf("KL: kc: 0x%04X, col: %u, row: %u, pressed: %b, time: %u, interrupt: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); 24 | #endif 25 | return true; 26 | } 27 | 28 | 29 | 30 | 31 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 32 | 33 | [_ART_BASE] = LAYOUT_ortho_2x4( 34 | BASE_1_1,BASE_1_2,BASE_1_3,BASE_1_4, 35 | BASE_2_1,BASE_2_2,BASE_2_3,BASE_2_4 36 | ), 37 | 38 | [_ART_NUM] = LAYOUT_ortho_2x4( 39 | NUM_1_1,NUM_1_2,NUM_1_3,NUM_1_4, 40 | NUM_2_1,NUM_2_2,NUM_2_3,NUM_2_4 41 | ), 42 | 43 | 44 | [_ART_PUNC] = LAYOUT_ortho_2x4( 45 | PUNC_1_1,PUNC_1_2,PUNC_1_3,PUNC_1_4, 46 | PUNC_2_1,PUNC_2_2,PUNC_2_3,PUNC_2_4 47 | ), 48 | 49 | [_ART_CUS] = LAYOUT_ortho_2x4( 50 | CUS_1_1,CUS_1_2,CUS_1_3,CUS_1_4, 51 | CUS_2_1,CUS_2_2,CUS_2_3,CUS_2_4 52 | ), 53 | 54 | [_ART_SYM] = LAYOUT_ortho_2x4( 55 | SYM_1_1,SYM_1_2,SYM_1_3,SYM_1_4, 56 | SYM_2_1,SYM_2_2,SYM_2_3,SYM_2_4 57 | ), 58 | 59 | [_ART_MOU] = LAYOUT_ortho_2x4( 60 | MOU_1_1,MOU_1_2,MOU_1_3,MOU_1_4, 61 | MOU_2_1,MOU_2_2,MOU_2_3,MOU_2_4 62 | ), 63 | 64 | [_ART_NAV] = LAYOUT_ortho_2x4( 65 | NAV_1_1,NAV_1_2,NAV_1_3,NAV_1_4, 66 | NAV_2_1,NAV_2_2,NAV_2_3,NAV_2_4 67 | ), 68 | }; 69 | -------------------------------------------------------------------------------- /Firmware Files/Version 0.8.1/Right Hand/combos.txt: -------------------------------------------------------------------------------- 1 | artsey_h||SEND_STRING("h")||BASE_2_1,BASE_2_3 2 | artsey_q||SEND_STRING("q")||BASE_1_1,BASE_1_3,BASE_1_4 3 | artsey_u||SEND_STRING("u")||BASE_2_2,BASE_2_3 4 | artsey_c||SEND_STRING("c")||BASE_2_1,BASE_2_2 5 | artsey_k||SEND_STRING("k")||BASE_2_2,BASE_2_4 6 | artsey_b||SEND_STRING("b")||BASE_2_1,BASE_2_4 7 | artsey_w||SEND_STRING("w")||BASE_1_1,BASE_1_4 8 | artsey_n||SEND_STRING("n")||BASE_2_3,BASE_2_4 9 | artsey_f||SEND_STRING("f")||BASE_1_1,BASE_1_2 10 | artsey_x||SEND_STRING("x")||BASE_1_2,BASE_1_3,BASE_1_4 11 | artsey_j||SEND_STRING("j")||BASE_1_3,BASE_1_4 12 | artsey_m||SEND_STRING("m")||BASE_2_2,BASE_2_3,BASE_2_4 13 | artsey_p||SEND_STRING("p")||BASE_2_1,BASE_2_3,BASE_2_4 14 | artsey_v||SEND_STRING("v")||BASE_1_2,BASE_1_4 15 | artsey_l||SEND_STRING("l")||BASE_2_1,BASE_2_2,BASE_2_3 16 | artsey_z||SEND_STRING("z")||BASE_1_1,BASE_1_2,BASE_1_3,BASE_1_4 17 | artsey_d||SEND_STRING("d")||BASE_1_1,BASE_1_2,BASE_1_3 18 | artsey_g||SEND_STRING("g")||BASE_1_2,BASE_1_3 19 | artsey_space||SEND_STRING(" ")||BASE_2_1,BASE_2_2,BASE_2_3,BASE_2_4 20 | artsey_backspace||SEND_STRING(SS_TAP(X_BSPC))||BASE_2_1,BASE_1_2 21 | artsey_del||SEND_STRING(SS_TAP(X_DEL))||BASE_1_2,BASE_2_3 22 | artsey_enter||SEND_STRING(SS_TAP(X_ENTER))||BASE_1_1,BASE_2_1 23 | artsey_escape||SEND_STRING(SS_TAP(X_ESC))||BASE_1_1,BASE_1_2,BASE_2_4 24 | artsey_quote||SEND_STRING("'")||BASE_1_1,BASE_2_2,BASE_2_3 25 | artsey_period||SEND_STRING(".")||BASE_1_1,BASE_2_3 26 | artsey_comma||SEND_STRING(",")||BASE_1_1,BASE_2_2 27 | artsey_slash||SEND_STRING("/")||BASE_1_1,BASE_2_4 28 | artsey_tab||SEND_STRING(SS_TAP(X_TAB))||BASE_1_1,BASE_1_2,BASE_1_3,BASE_2_4 29 | artsey_shift||add_oneshot_mods(MOD_BIT(KC_LSFT))||BASE_2_1,BASE_1_2,BASE_1_3,BASE_1_4 30 | artsey_ctrl||add_oneshot_mods(MOD_BIT(KC_LCTL))||BASE_1_4,BASE_2_1 31 | artsey_gui||add_oneshot_mods(MOD_BIT(KC_LGUI))||BASE_1_4,BASE_2_2 32 | artsey_alt||add_oneshot_mods(MOD_BIT(KC_LALT))||BASE_1_4,BASE_2_3 33 | artsey_lock||\n if (get_mods() & MOD_MASK_SHIFT){\n del_mods(MOD_MASK_SHIFT);;\n } else { \n add_mods(MOD_MASK_SHIFT); } ||BASE_1_2,BASE_2_2 34 | artsey_band||SEND_STRING("!")||BASE_1_3,BASE_2_3 35 | artsey_lock2||\n if (get_mods() & MOD_MASK_SHIFT){\n del_mods(MOD_MASK_SHIFT);;\n } else { \n add_mods(MOD_MASK_SHIFT); } ||NAV_1_2,NAV_2_2 36 | artsey_nav||layer_move(_ART_NAV)||BASE_1_2,BASE_2_1,BASE_2_3 37 | artsey_main1||layer_move(_ART_BASE)||NAV_1_2,NAV_2_1,NAV_2_3 38 | artsey_mou||layer_move(_ART_MOU)||BASE_1_1,BASE_1_3,BASE_2_2 39 | artsey_main2||layer_move(_ART_BASE)||MOU_1_1,MOU_1_3,MOU_2_2 40 | artsey_7||SEND_STRING("7")||NUM_1_1,NUM_1_2 41 | artsey_8||SEND_STRING("8")||NUM_1_2,NUM_1_3 42 | artsey_9||SEND_STRING("9")||NUM_2_1,NUM_2_2 43 | artsey_0||SEND_STRING("0")||NUM_2_2,NUM_2_3 -------------------------------------------------------------------------------- /Firmware Files/Version 0.8.1/Right Hand/processor.R: -------------------------------------------------------------------------------- 1 | #Read key.txt and combos.txt 2 | key_legend <- readLines("key.txt") 3 | combos <- readLines("combos.txt") 4 | 5 | #Remove blank lines from key legend. 6 | blank_lines <- which(key_legend=="") 7 | if(length(blank_lines)>0){ 8 | key_legend <- key_legend[-blank_lines] 9 | } 10 | 11 | #Remove blank lines from combos. 12 | blank_lines <- which(combos=="") 13 | if(length(blank_lines)>0){ 14 | combos <- combos[-blank_lines] 15 | } 16 | 17 | #Double Escape New-Lines in Combos to Acount for Multi-Line Functions 18 | combos <- gsub("\\n","\n",combos,fixed=TRUE) 19 | 20 | #Split up the Combos into data. 21 | combos <- strsplit(combos,split="\\|\\|") 22 | 23 | #Split up the Keys into data. 24 | key_legend <- strsplit(key_legend,split="\\|\\|") 25 | 26 | #Get the Data for Key Legend 27 | keys <- sapply(key_legend,"[[",1) 28 | qmk_codes <-sapply(key_legend,"[[",2) 29 | 30 | #Get the Data for Combos 31 | descriptions <- sapply(combos,"[[",1) 32 | commands <- sapply(combos,"[[",2) 33 | combo_keys <- sapply(combos,"[[",3) 34 | 35 | 36 | #Count the Combos 37 | num_combos <- length(descriptions) 38 | 39 | #Determine which QMK Codes are in Each Combo 40 | combo_Qmk_Codes <- list() 41 | 42 | aliases <- c() 43 | for(i in 1:length(keys)){ 44 | alias <- paste0("#define ",keys[i]," ",qmk_codes[i]) 45 | aliases <- c(aliases,alias) 46 | } 47 | 48 | sink("aliases.c") 49 | cat(paste0(aliases,collapse="\n")) 50 | sink() 51 | 52 | #Loop Through Combos 53 | for(i in 1:num_combos){ 54 | 55 | #Get the Keys in the Combo 56 | keys_in_combo <- unlist(strsplit(combo_keys[i],",")) 57 | 58 | # #Replace short-hand with qmk code via the key-legend 59 | # for(j in 1:length(keys_in_combo)){ 60 | # match_index <- which(keys==keys_in_combo[j]) 61 | # if(match_index){ 62 | # keys_in_combo[j] <- qmk_codes[match_index] 63 | # } 64 | # } 65 | 66 | #Add qmk_codes to list. 67 | combo_Qmk_Codes <- c(combo_Qmk_Codes,list(keys_in_combo)) 68 | } 69 | 70 | #Build combos.c 71 | 72 | #Initialize the combos.c text 73 | text <- c() 74 | 75 | #Initialize the enumeration of combos list for combos.c. 76 | enum <- c("enum combo_events{") 77 | 78 | #Make list of unique combos names 79 | combo_names <- c() 80 | #Loop through the 81 | for(i in 1:num_combos){ 82 | 83 | #Make Combo Name 84 | name <- gsub("\\,","_",combo_keys[i]) 85 | name <- paste0(c("COMBO_",name),collapse="") 86 | name <- toupper(name) 87 | 88 | #Add combo name to vector of combo names. 89 | combo_names <- c(combo_names,name) 90 | 91 | #Add combo name to the enumeration of combos. 92 | enum <- c(enum,paste0(name,",",collapse="")) 93 | } 94 | 95 | # Add COMBO_LENGTH to end of enumeration to get combo count. 96 | enum <- c(enum,"COMBO_LENGTH","};") 97 | 98 | #Add enumeration of combos to the combos.c text. 99 | text <- c(text,enum) 100 | 101 | #Add a line telling QMK to check the combo length at the end of the enumeration. 102 | lengthString <- "uint16_t COMBO_LEN = COMBO_LENGTH;" 103 | text <- c(text,lengthString) 104 | 105 | #Add the combo definitions to the text of combos.c. 106 | for(i in 1:num_combos){ 107 | string <- c("const uint16_t PROGMEM ") 108 | string <- c(string,tolower(combo_names[i])) 109 | string <- c(string,"[] = {") 110 | for(j in 1:length(combo_Qmk_Codes[[i]])){ 111 | string <- c(string,combo_Qmk_Codes[[i]][j],",") 112 | } 113 | string <- c(string,"COMBO_END};") 114 | string <- paste0(string,collapse="") 115 | text <- c(text,string) 116 | } 117 | 118 | #Add the combo functionality to each 119 | text <- c(text,"combo_t key_combos[] = {") 120 | for(i in 1:num_combos){ 121 | string <- c("[",combo_names[i],"]"," = ","COMBO_ACTION(",tolower(combo_names[i]),"),") 122 | string <- paste0(string,collapse="") 123 | text <- c(text,string) 124 | } 125 | 126 | text <- c(text,"};") 127 | 128 | text <- c(text,"void process_combo_event(uint16_t combo_index, bool pressed) {") 129 | text <- c(text,"switch(combo_index) {") 130 | 131 | for(i in 1:num_combos){ 132 | string <- c("case ",combo_names[i],":") 133 | string <- paste0(string,collapse="") 134 | text <- c(text,string) 135 | string <- c("if (pressed) {",commands[i],";}") 136 | string <- paste0(string,collapse="") 137 | text <- c(text,string,"break;") 138 | } 139 | text <- c(text,"}","}") 140 | text <- paste0(text,collapse="\n") 141 | 142 | 143 | sink("combos.c") 144 | cat(text) 145 | sink() 146 | 147 | 148 | -------------------------------------------------------------------------------- /Firmware Files/processor.R: -------------------------------------------------------------------------------- 1 | #Read key.txt and combos.txt 2 | key_legend <- readLines("key.txt") 3 | combos <- readLines("combos.txt") 4 | 5 | #Remove blank lines from key legend. 6 | blank_lines <- which(key_legend=="") 7 | if(length(blank_lines)>0){ 8 | key_legend <- key_legend[-blank_lines] 9 | } 10 | 11 | #Remove blank lines from combos. 12 | blank_lines <- which(combos=="") 13 | if(length(blank_lines)>0){ 14 | combos <- combos[-blank_lines] 15 | } 16 | 17 | #Double Escape New-Lines in Combos to Acount for Multi-Line Functions 18 | combos <- gsub("\\n","\n",combos,fixed=TRUE) 19 | 20 | #Split up the Combos into data. 21 | combos <- strsplit(combos,split="\\|\\|") 22 | 23 | #Split up the Keys into data. 24 | key_legend <- strsplit(key_legend,split="\\|\\|") 25 | 26 | #Get the Data for Key Legend 27 | keys <- sapply(key_legend,"[[",1) 28 | qmk_codes <-sapply(key_legend,"[[",2) 29 | 30 | #Get the Data for Combos 31 | descriptions <- sapply(combos,"[[",1) 32 | commands <- sapply(combos,"[[",2) 33 | combo_keys <- sapply(combos,"[[",3) 34 | 35 | 36 | #Count the Combos 37 | num_combos <- length(descriptions) 38 | 39 | #Determine which QMK Codes are in Each Combo 40 | combo_Qmk_Codes <- list() 41 | 42 | aliases <- c() 43 | for(i in 1:length(keys)){ 44 | alias <- paste0("#define ",keys[i]," ",qmk_codes[i]) 45 | aliases <- c(aliases,alias) 46 | } 47 | 48 | sink("aliases.c") 49 | cat(paste0(aliases,collapse="\n")) 50 | sink() 51 | 52 | #Loop Through Combos 53 | for(i in 1:num_combos){ 54 | 55 | #Get the Keys in the Combo 56 | keys_in_combo <- unlist(strsplit(combo_keys[i],",")) 57 | 58 | # #Replace short-hand with qmk code via the key-legend 59 | # for(j in 1:length(keys_in_combo)){ 60 | # match_index <- which(keys==keys_in_combo[j]) 61 | # if(match_index){ 62 | # keys_in_combo[j] <- qmk_codes[match_index] 63 | # } 64 | # } 65 | 66 | #Add qmk_codes to list. 67 | combo_Qmk_Codes <- c(combo_Qmk_Codes,list(keys_in_combo)) 68 | } 69 | 70 | #Build combos.c 71 | 72 | #Initialize the combos.c text 73 | text <- c() 74 | 75 | #Initialize the enumeration of combos list for combos.c. 76 | enum <- c("enum combo_events{") 77 | 78 | #Make list of unique combos names 79 | combo_names <- c() 80 | #Loop through the 81 | for(i in 1:num_combos){ 82 | 83 | #Make Combo Name 84 | # name <- gsub("\\,","_",combo_keys[i]) 85 | # name <- paste0(c("COMBO_",name),collapse="") 86 | # name <- toupper(name) 87 | name <- toupper(descriptions[i]) 88 | 89 | #Add combo name to vector of combo names. 90 | combo_names <- c(combo_names,name) 91 | 92 | #Add combo name to the enumeration of combos. 93 | 94 | enum <- c(enum,paste0(name,",",collapse="")) 95 | } 96 | 97 | # Add COMBO_LENGTH to end of enumeration to get combo count. 98 | enum <- c(enum,"COMBO_LENGTH","};") 99 | 100 | #Add enumeration of combos to the combos.c text. 101 | text <- c(text,enum) 102 | 103 | #Add a line telling QMK to check the combo length at the end of the enumeration. 104 | lengthString <- "uint16_t COMBO_LEN = COMBO_LENGTH;" 105 | text <- c(text,lengthString) 106 | 107 | #Add the combo definitions to the text of combos.c. 108 | for(i in 1:num_combos){ 109 | string <- c("const uint16_t PROGMEM ") 110 | string <- c(string,tolower(combo_names[i])) 111 | string <- c(string,"[] = {") 112 | for(j in 1:length(combo_Qmk_Codes[[i]])){ 113 | string <- c(string,combo_Qmk_Codes[[i]][j],",") 114 | } 115 | string <- c(string,"COMBO_END};") 116 | string <- paste0(string,collapse="") 117 | text <- c(text,string) 118 | } 119 | 120 | #Add the combo functionality to each 121 | text <- c(text,"combo_t key_combos[] = {") 122 | for(i in 1:num_combos){ 123 | string <- c("[",combo_names[i],"]"," = ","COMBO_ACTION(",tolower(combo_names[i]),"),") 124 | string <- paste0(string,collapse="") 125 | text <- c(text,string) 126 | } 127 | 128 | text <- c(text,"};") 129 | 130 | text <- c(text,"void process_combo_event(uint16_t combo_index, bool pressed) {") 131 | text <- c(text,"switch(combo_index) {") 132 | 133 | for(i in 1:num_combos){ 134 | string <- c("case ",combo_names[i],":") 135 | string <- paste0(string,collapse="") 136 | text <- c(text,string) 137 | string <- c("if (pressed) {",commands[i],";}") 138 | string <- paste0(string,collapse="") 139 | text <- c(text,string,"break;") 140 | } 141 | text <- c(text,"}","}") 142 | text <- paste0(text,collapse="\n") 143 | 144 | 145 | sink("combos.c") 146 | cat(text) 147 | sink() 148 | 149 | 150 | -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Left Hand/combos.txt: -------------------------------------------------------------------------------- 1 | artsey_h||SEND_STRING("h")||BASE_2_4,BASE_2_2 2 | artsey_q||SEND_STRING("q")||BASE_1_4,BASE_1_2,BASE_1_1 3 | artsey_u||SEND_STRING("u")||BASE_2_3,BASE_2_2 4 | artsey_c||SEND_STRING("c")||BASE_2_4,BASE_2_3 5 | artsey_k||SEND_STRING("k")||BASE_2_3,BASE_2_1 6 | artsey_b||SEND_STRING("b")||BASE_2_4,BASE_2_1 7 | artsey_w||SEND_STRING("w")||BASE_1_4,BASE_1_1 8 | artsey_n||SEND_STRING("n")||BASE_2_2,BASE_2_1 9 | artsey_f||SEND_STRING("f")||BASE_1_4,BASE_1_3 10 | artsey_x||SEND_STRING("x")||BASE_1_3,BASE_1_2,BASE_1_1 11 | artsey_j||SEND_STRING("j")||BASE_1_2,BASE_1_1 12 | artsey_m||SEND_STRING("m")||BASE_2_3,BASE_2_2,BASE_2_1 13 | artsey_p||SEND_STRING("p")||BASE_2_4,BASE_2_2,BASE_2_1 14 | artsey_v||SEND_STRING("v")||BASE_1_3,BASE_1_1 15 | artsey_l||SEND_STRING("l")||BASE_2_4,BASE_2_3,BASE_2_2 16 | artsey_z||SEND_STRING("z")||BASE_1_4,BASE_1_3,BASE_1_2,BASE_1_1 17 | artsey_d||SEND_STRING("d")||BASE_1_4,BASE_1_3,BASE_1_2 18 | artsey_g||SEND_STRING("g")||BASE_1_3,BASE_1_2 19 | 20 | artsey_space||SEND_STRING(" ")||BASE_2_4,BASE_2_3,BASE_2_2,BASE_2_1 21 | artsey_space_2||SEND_STRING(" ")||NAV_2_4,NAV_2_3,NAV_2_2,NAV_2_1 22 | 23 | artsey_backspace||SEND_STRING(SS_TAP(X_BSPC))||BASE_2_2,BASE_1_3 24 | artsey_backspace_2||SEND_STRING(SS_TAP(X_BSPC))||NAV_2_2,NAV_1_3 25 | artsey_del||SEND_STRING(SS_TAP(X_DEL))||BASE_1_3,BASE_2_4 26 | artsey_del_2||SEND_STRING(SS_TAP(X_DEL))||NAV_1_3,NAV_2_4 27 | 28 | artsey_enter||SEND_STRING(SS_TAP(X_ENTER))||BASE_1_4,BASE_2_4 29 | artsey_enter_2||SEND_STRING(SS_TAP(X_ENTER))||NAV_1_4,NAV_2_4 30 | artsey_escape||SEND_STRING(SS_TAP(X_ESC))||BASE_1_4,BASE_1_3,BASE_2_1 31 | artsey_escape_2||SEND_STRING(SS_TAP(X_ESC))||NAV_1_4,NAV_1_3,NAV_2_1 32 | 33 | 34 | artsey_quote||SEND_STRING("'")||BASE_1_3,BASE_2_3 35 | artsey_bang||SEND_STRING("!")||BASE_1_2,BASE_2_2 36 | artsey_quest||SEND_STRING("?")||BASE_1_1,BASE_2_1 37 | 38 | artsey_period||SEND_STRING(".")||BASE_1_4,BASE_2_2 39 | artsey_comma||SEND_STRING(",")||BASE_1_4,BASE_2_3 40 | artsey_slash||SEND_STRING("/")||BASE_1_4,BASE_2_1 41 | 42 | artsey_tab||SEND_STRING(SS_TAP(X_TAB))||BASE_1_4,BASE_1_3,BASE_1_2,BASE_2_1 43 | 44 | artsey_os_shift||add_oneshot_mods(MOD_BIT(KC_LSFT))||BASE_2_4,BASE_1_3,BASE_1_2,BASE_1_1 45 | 46 | artsey_ctrl||\n if (get_mods() & MOD_MASK_CTRL){\n del_mods(MOD_MASK_CTRL);;\n } else { \n add_mods(MOD_MASK_CTRL); } ||BASE_1_1,BASE_2_4 47 | artsey_ctrl_2||\n if (get_mods() & MOD_MASK_CTRL){\n del_mods(MOD_MASK_CTRL);;\n } else { \n add_mods(MOD_MASK_CTRL); } ||NAV_1_1,NAV_2_4 48 | artsey_ctrl_3||\n if (get_mods() & MOD_MASK_CTRL){\n del_mods(MOD_MASK_CTRL);;\n } else { \n add_mods(MOD_MASK_CTRL); } ||MOU_1_1,MOU_2_4 49 | 50 | artsey_gui||\n if (get_mods() & MOD_MASK_GUI){\n del_mods(MOD_MASK_GUI);;\n } else { \n add_mods(MOD_MASK_GUI); } ||BASE_1_1,BASE_2_3 51 | artsey_gui_2||\n if (get_mods() & MOD_MASK_GUI){\n del_mods(MOD_MASK_GUI);;\n } else { \n add_mods(MOD_MASK_GUI); } ||NAV_1_1,NAV_2_3 52 | artsey_gui_3||\n if (get_mods() & MOD_MASK_GUI){\n del_mods(MOD_MASK_GUI);;\n } else { \n add_mods(MOD_MASK_GUI); } ||MOU_1_1,MOU_2_3 53 | 54 | artsey_alt||\n if (get_mods() & MOD_MASK_ALT){\n del_mods(MOD_MASK_ALT);;\n } else { \n add_mods(MOD_MASK_ALT); } ||BASE_1_1,BASE_2_2 55 | artsey_alt_2||\n if (get_mods() & MOD_MASK_ALT){\n del_mods(MOD_MASK_ALT);;\n } else { \n add_mods(MOD_MASK_ALT); } ||NAV_1_1,NAV_2_2 56 | artsey_alt_3||\n if (get_mods() & MOD_MASK_ALT){\n del_mods(MOD_MASK_ALT);;\n } else { \n add_mods(MOD_MASK_ALT); } ||MOU_1_1,MOU_2_2 57 | 58 | artsey_shift||\n if (get_mods() & MOD_MASK_SHIFT){\n del_mods(MOD_MASK_SHIFT);;\n } else { \n add_mods(MOD_MASK_SHIFT); } ||BASE_1_4,BASE_2_3,BASE_2_2,BASE_2_1 59 | artsey_shift2||\n if (get_mods() & MOD_MASK_SHIFT){\n del_mods(MOD_MASK_SHIFT);;\n } else { \n add_mods(MOD_MASK_SHIFT); } ||NAV_1_4,NAV_2_3,NAV_2_2,NAV_2_1 60 | arsey_panic||clear_mods()||BASE_1_4,BASE_1_3,BASE_1_2,BASE_1_1,BASE_2_4,BASE_2_3,BASE_2_2,BASE_2_1 61 | arsey_panic_2||clear_mods()||NAV_1_4,NAV_1_3,NAV_1_2,NAV_1_1,NAV_2_4,NAV_2_3,NAV_2_2,NAV_2_1 62 | arsey_panic_3||clear_mods()||MOU_1_4,MOU_1_3,MOU_1_2,MOU_1_1,MOU_2_4,MOU_2_3,MOU_2_2,MOU_2_1 63 | 64 | 65 | artsey_nav||layer_move(_ART_NAV)||BASE_1_3,BASE_2_4,BASE_2_2 66 | artsey_main1||layer_move(_ART_BASE)||NAV_1_3,NAV_2_4,NAV_2_2 67 | artsey_mou||layer_move(_ART_MOU)||BASE_1_4,BASE_1_2,BASE_2_3 68 | artsey_main2||layer_move(_ART_BASE)||MOU_1_4,MOU_1_2,MOU_2_3 69 | 70 | 71 | artsey_7||SEND_STRING("7")||NUM_1_3,NUM_1_4 72 | artsey_8||SEND_STRING("8")||NUM_1_2,NUM_1_3 73 | artsey_9||SEND_STRING("9")||NUM_2_3,NUM_2_4 74 | artsey_0||SEND_STRING("0")||NUM_2_2,NUM_2_3 75 | -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Right Hand/combos.txt: -------------------------------------------------------------------------------- 1 | artsey_h||SEND_STRING("h")||BASE_2_1,BASE_2_3 2 | artsey_q||SEND_STRING("q")||BASE_1_1,BASE_1_3,BASE_1_4 3 | artsey_u||SEND_STRING("u")||BASE_2_2,BASE_2_3 4 | artsey_c||SEND_STRING("c")||BASE_2_1,BASE_2_2 5 | artsey_k||SEND_STRING("k")||BASE_2_2,BASE_2_4 6 | artsey_b||SEND_STRING("b")||BASE_2_1,BASE_2_4 7 | artsey_w||SEND_STRING("w")||BASE_1_1,BASE_1_4 8 | artsey_n||SEND_STRING("n")||BASE_2_3,BASE_2_4 9 | artsey_f||SEND_STRING("f")||BASE_1_1,BASE_1_2 10 | artsey_x||SEND_STRING("x")||BASE_1_2,BASE_1_3,BASE_1_4 11 | artsey_j||SEND_STRING("j")||BASE_1_3,BASE_1_4 12 | artsey_m||SEND_STRING("m")||BASE_2_2,BASE_2_3,BASE_2_4 13 | artsey_p||SEND_STRING("p")||BASE_2_1,BASE_2_3,BASE_2_4 14 | artsey_v||SEND_STRING("v")||BASE_1_2,BASE_1_4 15 | artsey_l||SEND_STRING("l")||BASE_2_1,BASE_2_2,BASE_2_3 16 | artsey_z||SEND_STRING("z")||BASE_1_1,BASE_1_2,BASE_1_3,BASE_1_4 17 | artsey_d||SEND_STRING("d")||BASE_1_1,BASE_1_2,BASE_1_3 18 | artsey_g||SEND_STRING("g")||BASE_1_2,BASE_1_3 19 | 20 | artsey_space||SEND_STRING(" ")||BASE_2_1,BASE_2_2,BASE_2_3,BASE_2_4 21 | artsey_space_2||SEND_STRING(" ")||NAV_2_1,NAV_2_2,NAV_2_3,NAV_2_4 22 | 23 | artsey_backspace||SEND_STRING(SS_TAP(X_BSPC))||BASE_2_1,BASE_1_2 24 | artsey_backspace_2||SEND_STRING(SS_TAP(X_BSPC))||NAV_2_1,NAV_1_2 25 | artsey_del||SEND_STRING(SS_TAP(X_DEL))||BASE_1_2,BASE_2_3 26 | artsey_del_2||SEND_STRING(SS_TAP(X_DEL))||NAV_1_2,NAV_2_3 27 | 28 | artsey_enter||SEND_STRING(SS_TAP(X_ENTER))||BASE_1_1,BASE_2_1 29 | artsey_enter_2||SEND_STRING(SS_TAP(X_ENTER))||NAV_1_1,NAV_2_1 30 | artsey_escape||SEND_STRING(SS_TAP(X_ESC))||BASE_1_1,BASE_1_2,BASE_2_4 31 | artsey_escape_2||SEND_STRING(SS_TAP(X_ESC))||NAV_1_1,NAV_1_2,NAV_2_4 32 | 33 | 34 | artsey_quote||SEND_STRING("'")||BASE_1_2,BASE_2_2 35 | artsey_bang||SEND_STRING("!")||BASE_1_3,BASE_2_3 36 | artsey_quest||SEND_STRING("?")||BASE_1_4,BASE_2_4 37 | 38 | artsey_period||SEND_STRING(".")||BASE_1_1,BASE_2_3 39 | artsey_comma||SEND_STRING(",")||BASE_1_1,BASE_2_2 40 | artsey_slash||SEND_STRING("/")||BASE_1_1,BASE_2_4 41 | 42 | artsey_tab||SEND_STRING(SS_TAP(X_TAB))||BASE_1_1,BASE_1_2,BASE_1_3,BASE_2_4 43 | 44 | artsey_os_shift||add_oneshot_mods(MOD_BIT(KC_LSFT))||BASE_2_1,BASE_1_2,BASE_1_3,BASE_1_4 45 | 46 | artsey_ctrl||\n if (get_mods() & MOD_MASK_CTRL){\n del_mods(MOD_MASK_CTRL);;\n } else { \n add_mods(MOD_MASK_CTRL); } ||BASE_1_4,BASE_2_1 47 | artsey_ctrl_2||\n if (get_mods() & MOD_MASK_CTRL){\n del_mods(MOD_MASK_CTRL);;\n } else { \n add_mods(MOD_MASK_CTRL); } ||NAV_1_4,NAV_2_1 48 | artsey_ctrl_3||\n if (get_mods() & MOD_MASK_CTRL){\n del_mods(MOD_MASK_CTRL);;\n } else { \n add_mods(MOD_MASK_CTRL); } ||MOU_1_4,MOU_2_1 49 | 50 | artsey_gui||\n if (get_mods() & MOD_MASK_GUI){\n del_mods(MOD_MASK_GUI);;\n } else { \n add_mods(MOD_MASK_GUI); } ||BASE_1_4,BASE_2_2 51 | artsey_gui_2||\n if (get_mods() & MOD_MASK_GUI){\n del_mods(MOD_MASK_GUI);;\n } else { \n add_mods(MOD_MASK_GUI); } ||NAV_1_4,NAV_2_2 52 | artsey_gui_3||\n if (get_mods() & MOD_MASK_GUI){\n del_mods(MOD_MASK_GUI);;\n } else { \n add_mods(MOD_MASK_GUI); } ||MOU_1_4,MOU_2_2 53 | 54 | artsey_alt||\n if (get_mods() & MOD_MASK_ALT){\n del_mods(MOD_MASK_ALT);;\n } else { \n add_mods(MOD_MASK_ALT); } ||BASE_1_4,BASE_2_3 55 | artsey_alt_2||\n if (get_mods() & MOD_MASK_ALT){\n del_mods(MOD_MASK_ALT);;\n } else { \n add_mods(MOD_MASK_ALT); } ||NAV_1_4,NAV_2_3 56 | artsey_alt_3||\n if (get_mods() & MOD_MASK_ALT){\n del_mods(MOD_MASK_ALT);;\n } else { \n add_mods(MOD_MASK_ALT); } ||MOU_1_4,MOU_2_3 57 | 58 | artsey_shift||\n if (get_mods() & MOD_MASK_SHIFT){\n del_mods(MOD_MASK_SHIFT);;\n } else { \n add_mods(MOD_MASK_SHIFT); } ||BASE_1_1,BASE_2_2,BASE_2_3,BASE_2_4 59 | artsey_shift2||\n if (get_mods() & MOD_MASK_SHIFT){\n del_mods(MOD_MASK_SHIFT);;\n } else { \n add_mods(MOD_MASK_SHIFT); } ||NAV_1_1,NAV_2_2,NAV_2_3,NAV_2_4 60 | arsey_panic||clear_mods(); \n layer_move(_ART_BASE);||BASE_1_1,BASE_1_2,BASE_1_3,BASE_1_4,BASE_2_1,BASE_2_2,BASE_2_3,BASE_2_4 61 | arsey_panic_2||clear_mods(); \n layer_move(_ART_BASE);||NAV_1_1,NAV_1_2,NAV_1_3,NAV_1_4,NAV_2_1,NAV_2_2,NAV_2_3,NAV_2_4 62 | arsey_panic_3||clear_mods(); \n layer_move(_ART_BASE);||MOU_1_1,MOU_1_2,MOU_1_3,MOU_1_4,MOU_2_1,MOU_2_2,MOU_2_3,MOU_2_4 63 | 64 | 65 | artsey_nav||layer_move(_ART_NAV)||BASE_1_2,BASE_2_1,BASE_2_3 66 | artsey_main1||layer_move(_ART_BASE)||NAV_1_2,NAV_2_1,NAV_2_3 67 | artsey_mou||layer_move(_ART_MOU)||BASE_1_1,BASE_1_3,BASE_2_2 68 | artsey_main2||layer_move(_ART_BASE)||MOU_1_1,MOU_1_3,MOU_2_2 69 | 70 | artsey_7||SEND_STRING("7")||NUM_1_1,NUM_1_2 71 | artsey_8||SEND_STRING("8")||NUM_1_2,NUM_1_3 72 | artsey_9||SEND_STRING("9")||NUM_2_1,NUM_2_2 73 | artsey_0||SEND_STRING("0")||NUM_2_2,NUM_2_3 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Setting up ARTSEY on your Keyboard 2 | 3 | From the `Firmware Files` folder in this repository, pick your flavor of artsey and download the files in that folder. Each folder contains `combos.c` which is the main file you will need to add ARTSEY to your keyboard. Each folder also contains a `keymaps` subfolder with a sample keymap for that flavor. Finally, each folder contains `combos.txt`, `key.txt`, and `processor.R` which will allow you to modify or extend ARTSEY. 4 | 5 | ## Put `combos.c` and `aliases.c` in `\qmk_firmware\keyboards\your_board` folder. 6 | 7 | `combos.c` and `aliases.c` are the only files you will need from this repository unless you want to extend ARTSEY. 8 | 9 | ## Enable Combos 10 | 11 | Ensure the following line appears somehwere in `rules.mk`: 12 | `COMBO_ENABLE = yes` 13 | 14 | 15 | *Note that if you are adding artey to another keyboard, add these seven layers to the other layers you have enumerated.* 16 | 17 | ## Create keymap. 18 | 19 | Use the `keymap.c` file in the `\Firmware Files\` folder to create your keymap. Note, you will need to update `LAYOUT_ortho_2x4` to whatever your layout name is for your keyboard. If you are making a dedicated 2x4 artsey board, you can simply duplicate the keymap below. If you are using an larger board, or adding ARTSEY to another board, make sure you have at least the keys outlined below in each respective layer. 20 | 21 | Always make sure you have `#include "combos.c"` and `#include alases.c` and have enumerated at least the 7 artsey layers `_ART_BASE,_ART_NUM,_ART_CUS,_ART_PUNC,_ART_MOU,_ART_NAV,_ART_SYM,` as below. If you are adding ARTSEY to another board, you can simply add these 7 layers and their respective keys to the keymap. Here is what a standard ARTSEY keymap looks like. 22 | 23 | 24 | ``` 25 | enum layers { 26 | _ART_BASE, 27 | _ART_NUM, 28 | _ART_CUS, 29 | _ART_PUNC, 30 | _ART_MOU, 31 | _ART_NAV, 32 | _ART_SYM, 33 | }; 34 | 35 | #include "aliases.c" 36 | #include "combos.c" 37 | 38 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 39 | 40 | [_ART_BASE] = LAYOUT_ortho_2x4( 41 | LT(_ART_SYM,KC_A),KC_R,KC_T,LT(_ART_NUM,KC_S), 42 | LT(_ART_PUNC,KC_E),KC_Y,KC_I,LT(_ART_CUS,KC_O) 43 | ), 44 | 45 | [_ART_NUM] = LAYOUT_ortho_2x4( 46 | KC_1,KC_2,KC_3,KC_TRNS, 47 | KC_4,KC_5,KC_6,KC_TRNS 48 | ), 49 | 50 | 51 | [_ART_PUNC] = LAYOUT_ortho_2x4( 52 | KC_EXLM,KC_BSLS,KC_SCLN,KC_GRV, 53 | KC_TRNS,KC_QUES,KC_MINS,KC_EQL 54 | ), 55 | 56 | [_ART_CUS] = LAYOUT_ortho_2x4( 57 | KC_MPLY,KC_MUTE,KC_KB_VOLUME_UP,KC_TRNS, 58 | KC_MPRV,KC_MNXT,KC_KB_VOLUME_DOWN,KC_TRNS 59 | ), 60 | 61 | [_ART_SYM] = LAYOUT_ortho_2x4( 62 | KC_TRNS,KC_LPRN,KC_RPRN,KC_LCBR, 63 | KC_TRNS,KC_LBRC,KC_RBRC,KC_RCBR 64 | ), 65 | 66 | [_ART_MOU] = LAYOUT_ortho_2x4( 67 | KC_BTN1,KC_MS_U,KC_BTN2,KC_WH_U, 68 | KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_D 69 | ), 70 | 71 | [_ART_NAV] = LAYOUT_ortho_2x4( 72 | KC_HOME,KC_UP,KC_END,KC_PGUP, 73 | KC_LEFT,KC_DOWN,KC_RIGHT,KC_PGDN 74 | ), 75 | }; 76 | ``` 77 | 78 | ## Done 79 | 80 | **You are ready to build your firmware`!** 81 | 82 | ## Extend or edit ARTSEY 83 | 84 | If you want to extend or edit artsey, modify `key.txt` and `combos.txt`. `key.txt` determines what each key does. `combos.txt` determines what each combo does. The entries in this file look like this: 85 | 86 | `artsey_v||SEND_STRING("v")||BASE_1_2,BASE_1_4` 87 | 88 | Note the line has e entries separated by double pipes `||`. Here is the description of each entry. 89 | 90 | 1. The name of the combo for readability. 91 | 2. The action for qmk to take when the combo is pressed. Here: sending the "v" key. 92 | 3. What keys make up the combo. Here it is the first row second column button on the base layer and the first row fourth column key from the base layer. 93 | 94 | They `key.txt` file has entries that look like this: 95 | 96 | `BASE_1_1||LT(_ART_SYM,KC_A)` 97 | 98 | Note the line has 2 entries separated by double pipes `||`. Here is the description of each entry. 99 | 100 | 1. The name of the key in the `keymap` and `key.txt`. Here it is the first row and first column key on the base layer. 101 | 2. What the key should do in terms of a QMK key code. Here it is a layer-tap key that sends "a" when tapped and moves to the ARTSEY symbol layer when held. 102 | 103 | Once you are done editing `combos.txt`, and `key.txt` head over to the [ARTSEY Processor APP](https://40percent.shinyapps.io/ARTSEY_Processor/) and upload your `key.txt` and `combos.txt` to get updaded `combos.c` and `aliases.c`. 104 | 105 | ## Licensing 106 | 107 | - Unless otherwise stated all source code is licensed under the Apache 2 License. 108 | 109 | - Unless otherwise stated the non source code contents of this repository are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License 110 | 111 | -------------------------------------------------------------------------------- /LICENSE-APACHE-2.0.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /Firmware Files/Version 0.8.1/Right Hand/combos.c: -------------------------------------------------------------------------------- 1 | enum combo_events{ 2 | COMBO_BASE_2_1_BASE_2_3, 3 | COMBO_BASE_1_1_BASE_1_3_BASE_1_4, 4 | COMBO_BASE_2_2_BASE_2_3, 5 | COMBO_BASE_2_1_BASE_2_2, 6 | COMBO_BASE_2_2_BASE_2_4, 7 | COMBO_BASE_2_1_BASE_2_4, 8 | COMBO_BASE_1_1_BASE_1_4, 9 | COMBO_BASE_2_3_BASE_2_4, 10 | COMBO_BASE_1_1_BASE_1_2, 11 | COMBO_BASE_1_2_BASE_1_3_BASE_1_4, 12 | COMBO_BASE_1_3_BASE_1_4, 13 | COMBO_BASE_2_2_BASE_2_3_BASE_2_4, 14 | COMBO_BASE_2_1_BASE_2_3_BASE_2_4, 15 | COMBO_BASE_1_2_BASE_1_4, 16 | COMBO_BASE_2_1_BASE_2_2_BASE_2_3, 17 | COMBO_BASE_1_1_BASE_1_2_BASE_1_3_BASE_1_4, 18 | COMBO_BASE_1_1_BASE_1_2_BASE_1_3, 19 | COMBO_BASE_1_2_BASE_1_3, 20 | COMBO_BASE_2_1_BASE_2_2_BASE_2_3_BASE_2_4, 21 | COMBO_BASE_2_1_BASE_1_2, 22 | COMBO_BASE_1_2_BASE_2_3, 23 | COMBO_BASE_1_1_BASE_2_1, 24 | COMBO_BASE_1_1_BASE_1_2_BASE_2_4, 25 | COMBO_BASE_1_1_BASE_2_2_BASE_2_3, 26 | COMBO_BASE_1_1_BASE_2_3, 27 | COMBO_BASE_1_1_BASE_2_2, 28 | COMBO_BASE_1_1_BASE_2_4, 29 | COMBO_BASE_1_1_BASE_1_2_BASE_1_3_BASE_2_4, 30 | COMBO_BASE_2_1_BASE_1_2_BASE_1_3_BASE_1_4, 31 | COMBO_BASE_1_4_BASE_2_1, 32 | COMBO_BASE_1_4_BASE_2_2, 33 | COMBO_BASE_1_4_BASE_2_3, 34 | COMBO_BASE_1_2_BASE_2_2, 35 | COMBO_BASE_1_3_BASE_2_3, 36 | COMBO_NAV_1_2_NAV_2_2, 37 | COMBO_BASE_1_2_BASE_2_1_BASE_2_3, 38 | COMBO_NAV_1_2_NAV_2_1_NAV_2_3, 39 | COMBO_BASE_1_1_BASE_1_3_BASE_2_2, 40 | COMBO_MOU_1_1_MOU_1_3_MOU_2_2, 41 | COMBO_NUM_1_1_NUM_1_2, 42 | COMBO_NUM_1_2_NUM_1_3, 43 | COMBO_NUM_2_1_NUM_2_2, 44 | COMBO_NUM_2_2_NUM_2_3, 45 | COMBO_LENGTH 46 | }; 47 | uint16_t COMBO_LEN = COMBO_LENGTH; 48 | const uint16_t PROGMEM combo_base_2_1_base_2_3[] = {BASE_2_1,BASE_2_3,COMBO_END}; 49 | const uint16_t PROGMEM combo_base_1_1_base_1_3_base_1_4[] = {BASE_1_1,BASE_1_3,BASE_1_4,COMBO_END}; 50 | const uint16_t PROGMEM combo_base_2_2_base_2_3[] = {BASE_2_2,BASE_2_3,COMBO_END}; 51 | const uint16_t PROGMEM combo_base_2_1_base_2_2[] = {BASE_2_1,BASE_2_2,COMBO_END}; 52 | const uint16_t PROGMEM combo_base_2_2_base_2_4[] = {BASE_2_2,BASE_2_4,COMBO_END}; 53 | const uint16_t PROGMEM combo_base_2_1_base_2_4[] = {BASE_2_1,BASE_2_4,COMBO_END}; 54 | const uint16_t PROGMEM combo_base_1_1_base_1_4[] = {BASE_1_1,BASE_1_4,COMBO_END}; 55 | const uint16_t PROGMEM combo_base_2_3_base_2_4[] = {BASE_2_3,BASE_2_4,COMBO_END}; 56 | const uint16_t PROGMEM combo_base_1_1_base_1_2[] = {BASE_1_1,BASE_1_2,COMBO_END}; 57 | const uint16_t PROGMEM combo_base_1_2_base_1_3_base_1_4[] = {BASE_1_2,BASE_1_3,BASE_1_4,COMBO_END}; 58 | const uint16_t PROGMEM combo_base_1_3_base_1_4[] = {BASE_1_3,BASE_1_4,COMBO_END}; 59 | const uint16_t PROGMEM combo_base_2_2_base_2_3_base_2_4[] = {BASE_2_2,BASE_2_3,BASE_2_4,COMBO_END}; 60 | const uint16_t PROGMEM combo_base_2_1_base_2_3_base_2_4[] = {BASE_2_1,BASE_2_3,BASE_2_4,COMBO_END}; 61 | const uint16_t PROGMEM combo_base_1_2_base_1_4[] = {BASE_1_2,BASE_1_4,COMBO_END}; 62 | const uint16_t PROGMEM combo_base_2_1_base_2_2_base_2_3[] = {BASE_2_1,BASE_2_2,BASE_2_3,COMBO_END}; 63 | const uint16_t PROGMEM combo_base_1_1_base_1_2_base_1_3_base_1_4[] = {BASE_1_1,BASE_1_2,BASE_1_3,BASE_1_4,COMBO_END}; 64 | const uint16_t PROGMEM combo_base_1_1_base_1_2_base_1_3[] = {BASE_1_1,BASE_1_2,BASE_1_3,COMBO_END}; 65 | const uint16_t PROGMEM combo_base_1_2_base_1_3[] = {BASE_1_2,BASE_1_3,COMBO_END}; 66 | const uint16_t PROGMEM combo_base_2_1_base_2_2_base_2_3_base_2_4[] = {BASE_2_1,BASE_2_2,BASE_2_3,BASE_2_4,COMBO_END}; 67 | const uint16_t PROGMEM combo_base_2_1_base_1_2[] = {BASE_2_1,BASE_1_2,COMBO_END}; 68 | const uint16_t PROGMEM combo_base_1_2_base_2_3[] = {BASE_1_2,BASE_2_3,COMBO_END}; 69 | const uint16_t PROGMEM combo_base_1_1_base_2_1[] = {BASE_1_1,BASE_2_1,COMBO_END}; 70 | const uint16_t PROGMEM combo_base_1_1_base_1_2_base_2_4[] = {BASE_1_1,BASE_1_2,BASE_2_4,COMBO_END}; 71 | const uint16_t PROGMEM combo_base_1_1_base_2_2_base_2_3[] = {BASE_1_1,BASE_2_2,BASE_2_3,COMBO_END}; 72 | const uint16_t PROGMEM combo_base_1_1_base_2_3[] = {BASE_1_1,BASE_2_3,COMBO_END}; 73 | const uint16_t PROGMEM combo_base_1_1_base_2_2[] = {BASE_1_1,BASE_2_2,COMBO_END}; 74 | const uint16_t PROGMEM combo_base_1_1_base_2_4[] = {BASE_1_1,BASE_2_4,COMBO_END}; 75 | const uint16_t PROGMEM combo_base_1_1_base_1_2_base_1_3_base_2_4[] = {BASE_1_1,BASE_1_2,BASE_1_3,BASE_2_4,COMBO_END}; 76 | const uint16_t PROGMEM combo_base_2_1_base_1_2_base_1_3_base_1_4[] = {BASE_2_1,BASE_1_2,BASE_1_3,BASE_1_4,COMBO_END}; 77 | const uint16_t PROGMEM combo_base_1_4_base_2_1[] = {BASE_1_4,BASE_2_1,COMBO_END}; 78 | const uint16_t PROGMEM combo_base_1_4_base_2_2[] = {BASE_1_4,BASE_2_2,COMBO_END}; 79 | const uint16_t PROGMEM combo_base_1_4_base_2_3[] = {BASE_1_4,BASE_2_3,COMBO_END}; 80 | const uint16_t PROGMEM combo_base_1_2_base_2_2[] = {BASE_1_2,BASE_2_2,COMBO_END}; 81 | const uint16_t PROGMEM combo_base_1_3_base_2_3[] = {BASE_1_3,BASE_2_3,COMBO_END}; 82 | const uint16_t PROGMEM combo_nav_1_2_nav_2_2[] = {NAV_1_2,NAV_2_2,COMBO_END}; 83 | const uint16_t PROGMEM combo_base_1_2_base_2_1_base_2_3[] = {BASE_1_2,BASE_2_1,BASE_2_3,COMBO_END}; 84 | const uint16_t PROGMEM combo_nav_1_2_nav_2_1_nav_2_3[] = {NAV_1_2,NAV_2_1,NAV_2_3,COMBO_END}; 85 | const uint16_t PROGMEM combo_base_1_1_base_1_3_base_2_2[] = {BASE_1_1,BASE_1_3,BASE_2_2,COMBO_END}; 86 | const uint16_t PROGMEM combo_mou_1_1_mou_1_3_mou_2_2[] = {MOU_1_1,MOU_1_3,MOU_2_2,COMBO_END}; 87 | const uint16_t PROGMEM combo_num_1_1_num_1_2[] = {NUM_1_1,NUM_1_2,COMBO_END}; 88 | const uint16_t PROGMEM combo_num_1_2_num_1_3[] = {NUM_1_2,NUM_1_3,COMBO_END}; 89 | const uint16_t PROGMEM combo_num_2_1_num_2_2[] = {NUM_2_1,NUM_2_2,COMBO_END}; 90 | const uint16_t PROGMEM combo_num_2_2_num_2_3[] = {NUM_2_2,NUM_2_3,COMBO_END}; 91 | combo_t key_combos[] = { 92 | [COMBO_BASE_2_1_BASE_2_3] = COMBO_ACTION(combo_base_2_1_base_2_3), 93 | [COMBO_BASE_1_1_BASE_1_3_BASE_1_4] = COMBO_ACTION(combo_base_1_1_base_1_3_base_1_4), 94 | [COMBO_BASE_2_2_BASE_2_3] = COMBO_ACTION(combo_base_2_2_base_2_3), 95 | [COMBO_BASE_2_1_BASE_2_2] = COMBO_ACTION(combo_base_2_1_base_2_2), 96 | [COMBO_BASE_2_2_BASE_2_4] = COMBO_ACTION(combo_base_2_2_base_2_4), 97 | [COMBO_BASE_2_1_BASE_2_4] = COMBO_ACTION(combo_base_2_1_base_2_4), 98 | [COMBO_BASE_1_1_BASE_1_4] = COMBO_ACTION(combo_base_1_1_base_1_4), 99 | [COMBO_BASE_2_3_BASE_2_4] = COMBO_ACTION(combo_base_2_3_base_2_4), 100 | [COMBO_BASE_1_1_BASE_1_2] = COMBO_ACTION(combo_base_1_1_base_1_2), 101 | [COMBO_BASE_1_2_BASE_1_3_BASE_1_4] = COMBO_ACTION(combo_base_1_2_base_1_3_base_1_4), 102 | [COMBO_BASE_1_3_BASE_1_4] = COMBO_ACTION(combo_base_1_3_base_1_4), 103 | [COMBO_BASE_2_2_BASE_2_3_BASE_2_4] = COMBO_ACTION(combo_base_2_2_base_2_3_base_2_4), 104 | [COMBO_BASE_2_1_BASE_2_3_BASE_2_4] = COMBO_ACTION(combo_base_2_1_base_2_3_base_2_4), 105 | [COMBO_BASE_1_2_BASE_1_4] = COMBO_ACTION(combo_base_1_2_base_1_4), 106 | [COMBO_BASE_2_1_BASE_2_2_BASE_2_3] = COMBO_ACTION(combo_base_2_1_base_2_2_base_2_3), 107 | [COMBO_BASE_1_1_BASE_1_2_BASE_1_3_BASE_1_4] = COMBO_ACTION(combo_base_1_1_base_1_2_base_1_3_base_1_4), 108 | [COMBO_BASE_1_1_BASE_1_2_BASE_1_3] = COMBO_ACTION(combo_base_1_1_base_1_2_base_1_3), 109 | [COMBO_BASE_1_2_BASE_1_3] = COMBO_ACTION(combo_base_1_2_base_1_3), 110 | [COMBO_BASE_2_1_BASE_2_2_BASE_2_3_BASE_2_4] = COMBO_ACTION(combo_base_2_1_base_2_2_base_2_3_base_2_4), 111 | [COMBO_BASE_2_1_BASE_1_2] = COMBO_ACTION(combo_base_2_1_base_1_2), 112 | [COMBO_BASE_1_2_BASE_2_3] = COMBO_ACTION(combo_base_1_2_base_2_3), 113 | [COMBO_BASE_1_1_BASE_2_1] = COMBO_ACTION(combo_base_1_1_base_2_1), 114 | [COMBO_BASE_1_1_BASE_1_2_BASE_2_4] = COMBO_ACTION(combo_base_1_1_base_1_2_base_2_4), 115 | [COMBO_BASE_1_1_BASE_2_2_BASE_2_3] = COMBO_ACTION(combo_base_1_1_base_2_2_base_2_3), 116 | [COMBO_BASE_1_1_BASE_2_3] = COMBO_ACTION(combo_base_1_1_base_2_3), 117 | [COMBO_BASE_1_1_BASE_2_2] = COMBO_ACTION(combo_base_1_1_base_2_2), 118 | [COMBO_BASE_1_1_BASE_2_4] = COMBO_ACTION(combo_base_1_1_base_2_4), 119 | [COMBO_BASE_1_1_BASE_1_2_BASE_1_3_BASE_2_4] = COMBO_ACTION(combo_base_1_1_base_1_2_base_1_3_base_2_4), 120 | [COMBO_BASE_2_1_BASE_1_2_BASE_1_3_BASE_1_4] = COMBO_ACTION(combo_base_2_1_base_1_2_base_1_3_base_1_4), 121 | [COMBO_BASE_1_4_BASE_2_1] = COMBO_ACTION(combo_base_1_4_base_2_1), 122 | [COMBO_BASE_1_4_BASE_2_2] = COMBO_ACTION(combo_base_1_4_base_2_2), 123 | [COMBO_BASE_1_4_BASE_2_3] = COMBO_ACTION(combo_base_1_4_base_2_3), 124 | [COMBO_BASE_1_2_BASE_2_2] = COMBO_ACTION(combo_base_1_2_base_2_2), 125 | [COMBO_BASE_1_3_BASE_2_3] = COMBO_ACTION(combo_base_1_3_base_2_3), 126 | [COMBO_NAV_1_2_NAV_2_2] = COMBO_ACTION(combo_nav_1_2_nav_2_2), 127 | [COMBO_BASE_1_2_BASE_2_1_BASE_2_3] = COMBO_ACTION(combo_base_1_2_base_2_1_base_2_3), 128 | [COMBO_NAV_1_2_NAV_2_1_NAV_2_3] = COMBO_ACTION(combo_nav_1_2_nav_2_1_nav_2_3), 129 | [COMBO_BASE_1_1_BASE_1_3_BASE_2_2] = COMBO_ACTION(combo_base_1_1_base_1_3_base_2_2), 130 | [COMBO_MOU_1_1_MOU_1_3_MOU_2_2] = COMBO_ACTION(combo_mou_1_1_mou_1_3_mou_2_2), 131 | [COMBO_NUM_1_1_NUM_1_2] = COMBO_ACTION(combo_num_1_1_num_1_2), 132 | [COMBO_NUM_1_2_NUM_1_3] = COMBO_ACTION(combo_num_1_2_num_1_3), 133 | [COMBO_NUM_2_1_NUM_2_2] = COMBO_ACTION(combo_num_2_1_num_2_2), 134 | [COMBO_NUM_2_2_NUM_2_3] = COMBO_ACTION(combo_num_2_2_num_2_3), 135 | }; 136 | void process_combo_event(uint16_t combo_index, bool pressed) { 137 | switch(combo_index) { 138 | case COMBO_BASE_2_1_BASE_2_3: 139 | if (pressed) {SEND_STRING("h");} 140 | break; 141 | case COMBO_BASE_1_1_BASE_1_3_BASE_1_4: 142 | if (pressed) {SEND_STRING("q");} 143 | break; 144 | case COMBO_BASE_2_2_BASE_2_3: 145 | if (pressed) {SEND_STRING("u");} 146 | break; 147 | case COMBO_BASE_2_1_BASE_2_2: 148 | if (pressed) {SEND_STRING("c");} 149 | break; 150 | case COMBO_BASE_2_2_BASE_2_4: 151 | if (pressed) {SEND_STRING("k");} 152 | break; 153 | case COMBO_BASE_2_1_BASE_2_4: 154 | if (pressed) {SEND_STRING("b");} 155 | break; 156 | case COMBO_BASE_1_1_BASE_1_4: 157 | if (pressed) {SEND_STRING("w");} 158 | break; 159 | case COMBO_BASE_2_3_BASE_2_4: 160 | if (pressed) {SEND_STRING("n");} 161 | break; 162 | case COMBO_BASE_1_1_BASE_1_2: 163 | if (pressed) {SEND_STRING("f");} 164 | break; 165 | case COMBO_BASE_1_2_BASE_1_3_BASE_1_4: 166 | if (pressed) {SEND_STRING("x");} 167 | break; 168 | case COMBO_BASE_1_3_BASE_1_4: 169 | if (pressed) {SEND_STRING("j");} 170 | break; 171 | case COMBO_BASE_2_2_BASE_2_3_BASE_2_4: 172 | if (pressed) {SEND_STRING("m");} 173 | break; 174 | case COMBO_BASE_2_1_BASE_2_3_BASE_2_4: 175 | if (pressed) {SEND_STRING("p");} 176 | break; 177 | case COMBO_BASE_1_2_BASE_1_4: 178 | if (pressed) {SEND_STRING("v");} 179 | break; 180 | case COMBO_BASE_2_1_BASE_2_2_BASE_2_3: 181 | if (pressed) {SEND_STRING("l");} 182 | break; 183 | case COMBO_BASE_1_1_BASE_1_2_BASE_1_3_BASE_1_4: 184 | if (pressed) {SEND_STRING("z");} 185 | break; 186 | case COMBO_BASE_1_1_BASE_1_2_BASE_1_3: 187 | if (pressed) {SEND_STRING("d");} 188 | break; 189 | case COMBO_BASE_1_2_BASE_1_3: 190 | if (pressed) {SEND_STRING("g");} 191 | break; 192 | case COMBO_BASE_2_1_BASE_2_2_BASE_2_3_BASE_2_4: 193 | if (pressed) {SEND_STRING(" ");} 194 | break; 195 | case COMBO_BASE_2_1_BASE_1_2: 196 | if (pressed) {SEND_STRING(SS_TAP(X_BSPC));} 197 | break; 198 | case COMBO_BASE_1_2_BASE_2_3: 199 | if (pressed) {SEND_STRING(SS_TAP(X_DEL));} 200 | break; 201 | case COMBO_BASE_1_1_BASE_2_1: 202 | if (pressed) {SEND_STRING(SS_TAP(X_ENTER));} 203 | break; 204 | case COMBO_BASE_1_1_BASE_1_2_BASE_2_4: 205 | if (pressed) {SEND_STRING(SS_TAP(X_ESC));} 206 | break; 207 | case COMBO_BASE_1_1_BASE_2_2_BASE_2_3: 208 | if (pressed) {SEND_STRING("'");} 209 | break; 210 | case COMBO_BASE_1_1_BASE_2_3: 211 | if (pressed) {SEND_STRING(".");} 212 | break; 213 | case COMBO_BASE_1_1_BASE_2_2: 214 | if (pressed) {SEND_STRING(",");} 215 | break; 216 | case COMBO_BASE_1_1_BASE_2_4: 217 | if (pressed) {SEND_STRING("/");} 218 | break; 219 | case COMBO_BASE_1_1_BASE_1_2_BASE_1_3_BASE_2_4: 220 | if (pressed) {SEND_STRING(SS_TAP(X_TAB));} 221 | break; 222 | case COMBO_BASE_2_1_BASE_1_2_BASE_1_3_BASE_1_4: 223 | if (pressed) {add_oneshot_mods(MOD_BIT(KC_LSFT));} 224 | break; 225 | case COMBO_BASE_1_4_BASE_2_1: 226 | if (pressed) {add_oneshot_mods(MOD_BIT(KC_LCTL));} 227 | break; 228 | case COMBO_BASE_1_4_BASE_2_2: 229 | if (pressed) {add_oneshot_mods(MOD_BIT(KC_LGUI));} 230 | break; 231 | case COMBO_BASE_1_4_BASE_2_3: 232 | if (pressed) {add_oneshot_mods(MOD_BIT(KC_LALT));} 233 | break; 234 | case COMBO_BASE_1_2_BASE_2_2: 235 | if (pressed) { 236 | if (get_mods() & MOD_MASK_SHIFT){ 237 | del_mods(MOD_MASK_SHIFT);; 238 | } else { 239 | add_mods(MOD_MASK_SHIFT); } ;} 240 | break; 241 | case COMBO_BASE_1_3_BASE_2_3: 242 | if (pressed) {SEND_STRING("!");} 243 | break; 244 | case COMBO_NAV_1_2_NAV_2_2: 245 | if (pressed) { 246 | if (get_mods() & MOD_MASK_SHIFT){ 247 | del_mods(MOD_MASK_SHIFT);; 248 | } else { 249 | add_mods(MOD_MASK_SHIFT); } ;} 250 | break; 251 | case COMBO_BASE_1_2_BASE_2_1_BASE_2_3: 252 | if (pressed) {layer_move(_ART_NAV);} 253 | break; 254 | case COMBO_NAV_1_2_NAV_2_1_NAV_2_3: 255 | if (pressed) {layer_move(_ART_BASE);} 256 | break; 257 | case COMBO_BASE_1_1_BASE_1_3_BASE_2_2: 258 | if (pressed) {layer_move(_ART_MOU);} 259 | break; 260 | case COMBO_MOU_1_1_MOU_1_3_MOU_2_2: 261 | if (pressed) {layer_move(_ART_BASE);} 262 | break; 263 | case COMBO_NUM_1_1_NUM_1_2: 264 | if (pressed) {SEND_STRING("7");} 265 | break; 266 | case COMBO_NUM_1_2_NUM_1_3: 267 | if (pressed) {SEND_STRING("8");} 268 | break; 269 | case COMBO_NUM_2_1_NUM_2_2: 270 | if (pressed) {SEND_STRING("9");} 271 | break; 272 | case COMBO_NUM_2_2_NUM_2_3: 273 | if (pressed) {SEND_STRING("0");} 274 | break; 275 | } 276 | } -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Left Hand/combos.c: -------------------------------------------------------------------------------- 1 | enum combo_events{ 2 | ARTSEY_H, 3 | ARTSEY_Q, 4 | ARTSEY_U, 5 | ARTSEY_C, 6 | ARTSEY_K, 7 | ARTSEY_B, 8 | ARTSEY_W, 9 | ARTSEY_N, 10 | ARTSEY_F, 11 | ARTSEY_X, 12 | ARTSEY_J, 13 | ARTSEY_M, 14 | ARTSEY_P, 15 | ARTSEY_V, 16 | ARTSEY_L, 17 | ARTSEY_Z, 18 | ARTSEY_D, 19 | ARTSEY_G, 20 | ARTSEY_SPACE, 21 | ARTSEY_SPACE_2, 22 | ARTSEY_BACKSPACE, 23 | ARTSEY_BACKSPACE_2, 24 | ARTSEY_DEL, 25 | ARTSEY_DEL_2, 26 | ARTSEY_ENTER, 27 | ARTSEY_ENTER_2, 28 | ARTSEY_ESCAPE, 29 | ARTSEY_ESCAPE_2, 30 | ARTSEY_QUOTE, 31 | ARTSEY_BANG, 32 | ARTSEY_QUEST, 33 | ARTSEY_PERIOD, 34 | ARTSEY_COMMA, 35 | ARTSEY_SLASH, 36 | ARTSEY_TAB, 37 | ARTSEY_OS_SHIFT, 38 | ARTSEY_CTRL, 39 | ARTSEY_CTRL_2, 40 | ARTSEY_CTRL_3, 41 | ARTSEY_GUI, 42 | ARTSEY_GUI_2, 43 | ARTSEY_GUI_3, 44 | ARTSEY_ALT, 45 | ARTSEY_ALT_2, 46 | ARTSEY_ALT_3, 47 | ARTSEY_SHIFT, 48 | ARTSEY_SHIFT2, 49 | ARSEY_PANIC, 50 | ARSEY_PANIC_2, 51 | ARSEY_PANIC_3, 52 | ARTSEY_NAV, 53 | ARTSEY_MAIN1, 54 | ARTSEY_MOU, 55 | ARTSEY_MAIN2, 56 | ARTSEY_7, 57 | ARTSEY_8, 58 | ARTSEY_9, 59 | ARTSEY_0, 60 | COMBO_LENGTH 61 | }; 62 | uint16_t COMBO_LEN = COMBO_LENGTH; 63 | const uint16_t PROGMEM artsey_h[] = {BASE_2_4,BASE_2_2,COMBO_END}; 64 | const uint16_t PROGMEM artsey_q[] = {BASE_1_4,BASE_1_2,BASE_1_1,COMBO_END}; 65 | const uint16_t PROGMEM artsey_u[] = {BASE_2_3,BASE_2_2,COMBO_END}; 66 | const uint16_t PROGMEM artsey_c[] = {BASE_2_4,BASE_2_3,COMBO_END}; 67 | const uint16_t PROGMEM artsey_k[] = {BASE_2_3,BASE_2_1,COMBO_END}; 68 | const uint16_t PROGMEM artsey_b[] = {BASE_2_4,BASE_2_1,COMBO_END}; 69 | const uint16_t PROGMEM artsey_w[] = {BASE_1_4,BASE_1_1,COMBO_END}; 70 | const uint16_t PROGMEM artsey_n[] = {BASE_2_2,BASE_2_1,COMBO_END}; 71 | const uint16_t PROGMEM artsey_f[] = {BASE_1_4,BASE_1_3,COMBO_END}; 72 | const uint16_t PROGMEM artsey_x[] = {BASE_1_3,BASE_1_2,BASE_1_1,COMBO_END}; 73 | const uint16_t PROGMEM artsey_j[] = {BASE_1_2,BASE_1_1,COMBO_END}; 74 | const uint16_t PROGMEM artsey_m[] = {BASE_2_3,BASE_2_2,BASE_2_1,COMBO_END}; 75 | const uint16_t PROGMEM artsey_p[] = {BASE_2_4,BASE_2_2,BASE_2_1,COMBO_END}; 76 | const uint16_t PROGMEM artsey_v[] = {BASE_1_3,BASE_1_1,COMBO_END}; 77 | const uint16_t PROGMEM artsey_l[] = {BASE_2_4,BASE_2_3,BASE_2_2,COMBO_END}; 78 | const uint16_t PROGMEM artsey_z[] = {BASE_1_4,BASE_1_3,BASE_1_2,BASE_1_1,COMBO_END}; 79 | const uint16_t PROGMEM artsey_d[] = {BASE_1_4,BASE_1_3,BASE_1_2,COMBO_END}; 80 | const uint16_t PROGMEM artsey_g[] = {BASE_1_3,BASE_1_2,COMBO_END}; 81 | const uint16_t PROGMEM artsey_space[] = {BASE_2_4,BASE_2_3,BASE_2_2,BASE_2_1,COMBO_END}; 82 | const uint16_t PROGMEM artsey_space_2[] = {NAV_2_4,NAV_2_3,NAV_2_2,NAV_2_1,COMBO_END}; 83 | const uint16_t PROGMEM artsey_backspace[] = {BASE_2_2,BASE_1_3,COMBO_END}; 84 | const uint16_t PROGMEM artsey_backspace_2[] = {NAV_2_2,NAV_1_3,COMBO_END}; 85 | const uint16_t PROGMEM artsey_del[] = {BASE_1_3,BASE_2_4,COMBO_END}; 86 | const uint16_t PROGMEM artsey_del_2[] = {NAV_1_3,NAV_2_4,COMBO_END}; 87 | const uint16_t PROGMEM artsey_enter[] = {BASE_1_4,BASE_2_4,COMBO_END}; 88 | const uint16_t PROGMEM artsey_enter_2[] = {NAV_1_4,NAV_2_4,COMBO_END}; 89 | const uint16_t PROGMEM artsey_escape[] = {BASE_1_4,BASE_1_3,BASE_2_1,COMBO_END}; 90 | const uint16_t PROGMEM artsey_escape_2[] = {NAV_1_4,NAV_1_3,NAV_2_1,COMBO_END}; 91 | const uint16_t PROGMEM artsey_quote[] = {BASE_1_3,BASE_2_3,COMBO_END}; 92 | const uint16_t PROGMEM artsey_bang[] = {BASE_1_2,BASE_2_2,COMBO_END}; 93 | const uint16_t PROGMEM artsey_quest[] = {BASE_1_1,BASE_2_1,COMBO_END}; 94 | const uint16_t PROGMEM artsey_period[] = {BASE_1_4,BASE_2_2,COMBO_END}; 95 | const uint16_t PROGMEM artsey_comma[] = {BASE_1_4,BASE_2_3,COMBO_END}; 96 | const uint16_t PROGMEM artsey_slash[] = {BASE_1_4,BASE_2_1,COMBO_END}; 97 | const uint16_t PROGMEM artsey_tab[] = {BASE_1_4,BASE_1_3,BASE_1_2,BASE_2_1,COMBO_END}; 98 | const uint16_t PROGMEM artsey_os_shift[] = {BASE_2_4,BASE_1_3,BASE_1_2,BASE_1_1,COMBO_END}; 99 | const uint16_t PROGMEM artsey_ctrl[] = {BASE_1_1,BASE_2_4,COMBO_END}; 100 | const uint16_t PROGMEM artsey_ctrl_2[] = {NAV_1_1,NAV_2_4,COMBO_END}; 101 | const uint16_t PROGMEM artsey_ctrl_3[] = {MOU_1_1,MOU_2_4,COMBO_END}; 102 | const uint16_t PROGMEM artsey_gui[] = {BASE_1_1,BASE_2_3,COMBO_END}; 103 | const uint16_t PROGMEM artsey_gui_2[] = {NAV_1_1,NAV_2_3,COMBO_END}; 104 | const uint16_t PROGMEM artsey_gui_3[] = {MOU_1_1,MOU_2_3,COMBO_END}; 105 | const uint16_t PROGMEM artsey_alt[] = {BASE_1_1,BASE_2_2,COMBO_END}; 106 | const uint16_t PROGMEM artsey_alt_2[] = {NAV_1_1,NAV_2_2,COMBO_END}; 107 | const uint16_t PROGMEM artsey_alt_3[] = {MOU_1_1,MOU_2_2,COMBO_END}; 108 | const uint16_t PROGMEM artsey_shift[] = {BASE_1_4,BASE_2_3,BASE_2_2,BASE_2_1,COMBO_END}; 109 | const uint16_t PROGMEM artsey_shift2[] = {NAV_1_4,NAV_2_3,NAV_2_2,NAV_2_1,COMBO_END}; 110 | const uint16_t PROGMEM arsey_panic[] = {BASE_1_4,BASE_1_3,BASE_1_2,BASE_1_1,BASE_2_4,BASE_2_3,BASE_2_2,BASE_2_1,COMBO_END}; 111 | const uint16_t PROGMEM arsey_panic_2[] = {NAV_1_4,NAV_1_3,NAV_1_2,NAV_1_1,NAV_2_4,NAV_2_3,NAV_2_2,NAV_2_1,COMBO_END}; 112 | const uint16_t PROGMEM arsey_panic_3[] = {MOU_1_4,MOU_1_3,MOU_1_2,MOU_1_1,MOU_2_4,MOU_2_3,MOU_2_2,MOU_2_1,COMBO_END}; 113 | const uint16_t PROGMEM artsey_nav[] = {BASE_1_3,BASE_2_4,BASE_2_2,COMBO_END}; 114 | const uint16_t PROGMEM artsey_main1[] = {NAV_1_3,NAV_2_4,NAV_2_2,COMBO_END}; 115 | const uint16_t PROGMEM artsey_mou[] = {BASE_1_4,BASE_1_2,BASE_2_3,COMBO_END}; 116 | const uint16_t PROGMEM artsey_main2[] = {MOU_1_4,MOU_1_2,MOU_2_3,COMBO_END}; 117 | const uint16_t PROGMEM artsey_7[] = {NUM_1_3,NUM_1_4,COMBO_END}; 118 | const uint16_t PROGMEM artsey_8[] = {NUM_1_2,NUM_1_3,COMBO_END}; 119 | const uint16_t PROGMEM artsey_9[] = {NUM_2_3,NUM_2_4,COMBO_END}; 120 | const uint16_t PROGMEM artsey_0[] = {NUM_2_2,NUM_2_3,COMBO_END}; 121 | combo_t key_combos[] = { 122 | [ARTSEY_H] = COMBO_ACTION(artsey_h), 123 | [ARTSEY_Q] = COMBO_ACTION(artsey_q), 124 | [ARTSEY_U] = COMBO_ACTION(artsey_u), 125 | [ARTSEY_C] = COMBO_ACTION(artsey_c), 126 | [ARTSEY_K] = COMBO_ACTION(artsey_k), 127 | [ARTSEY_B] = COMBO_ACTION(artsey_b), 128 | [ARTSEY_W] = COMBO_ACTION(artsey_w), 129 | [ARTSEY_N] = COMBO_ACTION(artsey_n), 130 | [ARTSEY_F] = COMBO_ACTION(artsey_f), 131 | [ARTSEY_X] = COMBO_ACTION(artsey_x), 132 | [ARTSEY_J] = COMBO_ACTION(artsey_j), 133 | [ARTSEY_M] = COMBO_ACTION(artsey_m), 134 | [ARTSEY_P] = COMBO_ACTION(artsey_p), 135 | [ARTSEY_V] = COMBO_ACTION(artsey_v), 136 | [ARTSEY_L] = COMBO_ACTION(artsey_l), 137 | [ARTSEY_Z] = COMBO_ACTION(artsey_z), 138 | [ARTSEY_D] = COMBO_ACTION(artsey_d), 139 | [ARTSEY_G] = COMBO_ACTION(artsey_g), 140 | [ARTSEY_SPACE] = COMBO_ACTION(artsey_space), 141 | [ARTSEY_SPACE_2] = COMBO_ACTION(artsey_space_2), 142 | [ARTSEY_BACKSPACE] = COMBO_ACTION(artsey_backspace), 143 | [ARTSEY_BACKSPACE_2] = COMBO_ACTION(artsey_backspace_2), 144 | [ARTSEY_DEL] = COMBO_ACTION(artsey_del), 145 | [ARTSEY_DEL_2] = COMBO_ACTION(artsey_del_2), 146 | [ARTSEY_ENTER] = COMBO_ACTION(artsey_enter), 147 | [ARTSEY_ENTER_2] = COMBO_ACTION(artsey_enter_2), 148 | [ARTSEY_ESCAPE] = COMBO_ACTION(artsey_escape), 149 | [ARTSEY_ESCAPE_2] = COMBO_ACTION(artsey_escape_2), 150 | [ARTSEY_QUOTE] = COMBO_ACTION(artsey_quote), 151 | [ARTSEY_BANG] = COMBO_ACTION(artsey_bang), 152 | [ARTSEY_QUEST] = COMBO_ACTION(artsey_quest), 153 | [ARTSEY_PERIOD] = COMBO_ACTION(artsey_period), 154 | [ARTSEY_COMMA] = COMBO_ACTION(artsey_comma), 155 | [ARTSEY_SLASH] = COMBO_ACTION(artsey_slash), 156 | [ARTSEY_TAB] = COMBO_ACTION(artsey_tab), 157 | [ARTSEY_OS_SHIFT] = COMBO_ACTION(artsey_os_shift), 158 | [ARTSEY_CTRL] = COMBO_ACTION(artsey_ctrl), 159 | [ARTSEY_CTRL_2] = COMBO_ACTION(artsey_ctrl_2), 160 | [ARTSEY_CTRL_3] = COMBO_ACTION(artsey_ctrl_3), 161 | [ARTSEY_GUI] = COMBO_ACTION(artsey_gui), 162 | [ARTSEY_GUI_2] = COMBO_ACTION(artsey_gui_2), 163 | [ARTSEY_GUI_3] = COMBO_ACTION(artsey_gui_3), 164 | [ARTSEY_ALT] = COMBO_ACTION(artsey_alt), 165 | [ARTSEY_ALT_2] = COMBO_ACTION(artsey_alt_2), 166 | [ARTSEY_ALT_3] = COMBO_ACTION(artsey_alt_3), 167 | [ARTSEY_SHIFT] = COMBO_ACTION(artsey_shift), 168 | [ARTSEY_SHIFT2] = COMBO_ACTION(artsey_shift2), 169 | [ARSEY_PANIC] = COMBO_ACTION(arsey_panic), 170 | [ARSEY_PANIC_2] = COMBO_ACTION(arsey_panic_2), 171 | [ARSEY_PANIC_3] = COMBO_ACTION(arsey_panic_3), 172 | [ARTSEY_NAV] = COMBO_ACTION(artsey_nav), 173 | [ARTSEY_MAIN1] = COMBO_ACTION(artsey_main1), 174 | [ARTSEY_MOU] = COMBO_ACTION(artsey_mou), 175 | [ARTSEY_MAIN2] = COMBO_ACTION(artsey_main2), 176 | [ARTSEY_7] = COMBO_ACTION(artsey_7), 177 | [ARTSEY_8] = COMBO_ACTION(artsey_8), 178 | [ARTSEY_9] = COMBO_ACTION(artsey_9), 179 | [ARTSEY_0] = COMBO_ACTION(artsey_0), 180 | }; 181 | void process_combo_event(uint16_t combo_index, bool pressed) { 182 | switch(combo_index) { 183 | case ARTSEY_H: 184 | if (pressed) {SEND_STRING("h");} 185 | break; 186 | case ARTSEY_Q: 187 | if (pressed) {SEND_STRING("q");} 188 | break; 189 | case ARTSEY_U: 190 | if (pressed) {SEND_STRING("u");} 191 | break; 192 | case ARTSEY_C: 193 | if (pressed) {SEND_STRING("c");} 194 | break; 195 | case ARTSEY_K: 196 | if (pressed) {SEND_STRING("k");} 197 | break; 198 | case ARTSEY_B: 199 | if (pressed) {SEND_STRING("b");} 200 | break; 201 | case ARTSEY_W: 202 | if (pressed) {SEND_STRING("w");} 203 | break; 204 | case ARTSEY_N: 205 | if (pressed) {SEND_STRING("n");} 206 | break; 207 | case ARTSEY_F: 208 | if (pressed) {SEND_STRING("f");} 209 | break; 210 | case ARTSEY_X: 211 | if (pressed) {SEND_STRING("x");} 212 | break; 213 | case ARTSEY_J: 214 | if (pressed) {SEND_STRING("j");} 215 | break; 216 | case ARTSEY_M: 217 | if (pressed) {SEND_STRING("m");} 218 | break; 219 | case ARTSEY_P: 220 | if (pressed) {SEND_STRING("p");} 221 | break; 222 | case ARTSEY_V: 223 | if (pressed) {SEND_STRING("v");} 224 | break; 225 | case ARTSEY_L: 226 | if (pressed) {SEND_STRING("l");} 227 | break; 228 | case ARTSEY_Z: 229 | if (pressed) {SEND_STRING("z");} 230 | break; 231 | case ARTSEY_D: 232 | if (pressed) {SEND_STRING("d");} 233 | break; 234 | case ARTSEY_G: 235 | if (pressed) {SEND_STRING("g");} 236 | break; 237 | case ARTSEY_SPACE: 238 | if (pressed) {SEND_STRING(" ");} 239 | break; 240 | case ARTSEY_SPACE_2: 241 | if (pressed) {SEND_STRING(" ");} 242 | break; 243 | case ARTSEY_BACKSPACE: 244 | if (pressed) {SEND_STRING(SS_TAP(X_BSPC));} 245 | break; 246 | case ARTSEY_BACKSPACE_2: 247 | if (pressed) {SEND_STRING(SS_TAP(X_BSPC));} 248 | break; 249 | case ARTSEY_DEL: 250 | if (pressed) {SEND_STRING(SS_TAP(X_DEL));} 251 | break; 252 | case ARTSEY_DEL_2: 253 | if (pressed) {SEND_STRING(SS_TAP(X_DEL));} 254 | break; 255 | case ARTSEY_ENTER: 256 | if (pressed) {SEND_STRING(SS_TAP(X_ENTER));} 257 | break; 258 | case ARTSEY_ENTER_2: 259 | if (pressed) {SEND_STRING(SS_TAP(X_ENTER));} 260 | break; 261 | case ARTSEY_ESCAPE: 262 | if (pressed) {SEND_STRING(SS_TAP(X_ESC));} 263 | break; 264 | case ARTSEY_ESCAPE_2: 265 | if (pressed) {SEND_STRING(SS_TAP(X_ESC));} 266 | break; 267 | case ARTSEY_QUOTE: 268 | if (pressed) {SEND_STRING("'");} 269 | break; 270 | case ARTSEY_BANG: 271 | if (pressed) {SEND_STRING("!");} 272 | break; 273 | case ARTSEY_QUEST: 274 | if (pressed) {SEND_STRING("?");} 275 | break; 276 | case ARTSEY_PERIOD: 277 | if (pressed) {SEND_STRING(".");} 278 | break; 279 | case ARTSEY_COMMA: 280 | if (pressed) {SEND_STRING(",");} 281 | break; 282 | case ARTSEY_SLASH: 283 | if (pressed) {SEND_STRING("/");} 284 | break; 285 | case ARTSEY_TAB: 286 | if (pressed) {SEND_STRING(SS_TAP(X_TAB));} 287 | break; 288 | case ARTSEY_OS_SHIFT: 289 | if (pressed) {add_oneshot_mods(MOD_BIT(KC_LSFT));} 290 | break; 291 | case ARTSEY_CTRL: 292 | if (pressed) { 293 | if (get_mods() & MOD_MASK_CTRL){ 294 | del_mods(MOD_MASK_CTRL);; 295 | } else { 296 | add_mods(MOD_MASK_CTRL); } ;} 297 | break; 298 | case ARTSEY_CTRL_2: 299 | if (pressed) { 300 | if (get_mods() & MOD_MASK_CTRL){ 301 | del_mods(MOD_MASK_CTRL);; 302 | } else { 303 | add_mods(MOD_MASK_CTRL); } ;} 304 | break; 305 | case ARTSEY_CTRL_3: 306 | if (pressed) { 307 | if (get_mods() & MOD_MASK_CTRL){ 308 | del_mods(MOD_MASK_CTRL);; 309 | } else { 310 | add_mods(MOD_MASK_CTRL); } ;} 311 | break; 312 | case ARTSEY_GUI: 313 | if (pressed) { 314 | if (get_mods() & MOD_MASK_GUI){ 315 | del_mods(MOD_MASK_GUI);; 316 | } else { 317 | add_mods(MOD_MASK_GUI); } ;} 318 | break; 319 | case ARTSEY_GUI_2: 320 | if (pressed) { 321 | if (get_mods() & MOD_MASK_GUI){ 322 | del_mods(MOD_MASK_GUI);; 323 | } else { 324 | add_mods(MOD_MASK_GUI); } ;} 325 | break; 326 | case ARTSEY_GUI_3: 327 | if (pressed) { 328 | if (get_mods() & MOD_MASK_GUI){ 329 | del_mods(MOD_MASK_GUI);; 330 | } else { 331 | add_mods(MOD_MASK_GUI); } ;} 332 | break; 333 | case ARTSEY_ALT: 334 | if (pressed) { 335 | if (get_mods() & MOD_MASK_ALT){ 336 | del_mods(MOD_MASK_ALT);; 337 | } else { 338 | add_mods(MOD_MASK_ALT); } ;} 339 | break; 340 | case ARTSEY_ALT_2: 341 | if (pressed) { 342 | if (get_mods() & MOD_MASK_ALT){ 343 | del_mods(MOD_MASK_ALT);; 344 | } else { 345 | add_mods(MOD_MASK_ALT); } ;} 346 | break; 347 | case ARTSEY_ALT_3: 348 | if (pressed) { 349 | if (get_mods() & MOD_MASK_ALT){ 350 | del_mods(MOD_MASK_ALT);; 351 | } else { 352 | add_mods(MOD_MASK_ALT); } ;} 353 | break; 354 | case ARTSEY_SHIFT: 355 | if (pressed) { 356 | if (get_mods() & MOD_MASK_SHIFT){ 357 | del_mods(MOD_MASK_SHIFT);; 358 | } else { 359 | add_mods(MOD_MASK_SHIFT); } ;} 360 | break; 361 | case ARTSEY_SHIFT2: 362 | if (pressed) { 363 | if (get_mods() & MOD_MASK_SHIFT){ 364 | del_mods(MOD_MASK_SHIFT);; 365 | } else { 366 | add_mods(MOD_MASK_SHIFT); } ;} 367 | break; 368 | case ARSEY_PANIC: 369 | if (pressed) {clear_mods();} 370 | break; 371 | case ARSEY_PANIC_2: 372 | if (pressed) {clear_mods();} 373 | break; 374 | case ARSEY_PANIC_3: 375 | if (pressed) {clear_mods();} 376 | break; 377 | case ARTSEY_NAV: 378 | if (pressed) {layer_move(_ART_NAV);} 379 | break; 380 | case ARTSEY_MAIN1: 381 | if (pressed) {layer_move(_ART_BASE);} 382 | break; 383 | case ARTSEY_MOU: 384 | if (pressed) {layer_move(_ART_MOU);} 385 | break; 386 | case ARTSEY_MAIN2: 387 | if (pressed) {layer_move(_ART_BASE);} 388 | break; 389 | case ARTSEY_7: 390 | if (pressed) {SEND_STRING("7");} 391 | break; 392 | case ARTSEY_8: 393 | if (pressed) {SEND_STRING("8");} 394 | break; 395 | case ARTSEY_9: 396 | if (pressed) {SEND_STRING("9");} 397 | break; 398 | case ARTSEY_0: 399 | if (pressed) {SEND_STRING("0");} 400 | break; 401 | } 402 | } -------------------------------------------------------------------------------- /Firmware Files/Version 0.9.0/Right Hand/combos.c: -------------------------------------------------------------------------------- 1 | enum combo_events{ 2 | ARTSEY_H, 3 | ARTSEY_Q, 4 | ARTSEY_U, 5 | ARTSEY_C, 6 | ARTSEY_K, 7 | ARTSEY_B, 8 | ARTSEY_W, 9 | ARTSEY_N, 10 | ARTSEY_F, 11 | ARTSEY_X, 12 | ARTSEY_J, 13 | ARTSEY_M, 14 | ARTSEY_P, 15 | ARTSEY_V, 16 | ARTSEY_L, 17 | ARTSEY_Z, 18 | ARTSEY_D, 19 | ARTSEY_G, 20 | ARTSEY_SPACE, 21 | ARTSEY_SPACE_2, 22 | ARTSEY_BACKSPACE, 23 | ARTSEY_BACKSPACE_2, 24 | ARTSEY_DEL, 25 | ARTSEY_DEL_2, 26 | ARTSEY_ENTER, 27 | ARTSEY_ENTER_2, 28 | ARTSEY_ESCAPE, 29 | ARTSEY_ESCAPE_2, 30 | ARTSEY_QUOTE, 31 | ARTSEY_BANG, 32 | ARTSEY_QUEST, 33 | ARTSEY_PERIOD, 34 | ARTSEY_COMMA, 35 | ARTSEY_SLASH, 36 | ARTSEY_TAB, 37 | ARTSEY_OS_SHIFT, 38 | ARTSEY_CTRL, 39 | ARTSEY_CTRL_2, 40 | ARTSEY_CTRL_3, 41 | ARTSEY_GUI, 42 | ARTSEY_GUI_2, 43 | ARTSEY_GUI_3, 44 | ARTSEY_ALT, 45 | ARTSEY_ALT_2, 46 | ARTSEY_ALT_3, 47 | ARTSEY_SHIFT, 48 | ARTSEY_SHIFT2, 49 | ARSEY_PANIC, 50 | ARSEY_PANIC_2, 51 | ARSEY_PANIC_3, 52 | ARTSEY_NAV, 53 | ARTSEY_MAIN1, 54 | ARTSEY_MOU, 55 | ARTSEY_MAIN2, 56 | ARTSEY_7, 57 | ARTSEY_8, 58 | ARTSEY_9, 59 | ARTSEY_0, 60 | COMBO_LENGTH 61 | }; 62 | uint16_t COMBO_LEN = COMBO_LENGTH; 63 | const uint16_t PROGMEM artsey_h[] = {BASE_2_1,BASE_2_3,COMBO_END}; 64 | const uint16_t PROGMEM artsey_q[] = {BASE_1_1,BASE_1_3,BASE_1_4,COMBO_END}; 65 | const uint16_t PROGMEM artsey_u[] = {BASE_2_2,BASE_2_3,COMBO_END}; 66 | const uint16_t PROGMEM artsey_c[] = {BASE_2_1,BASE_2_2,COMBO_END}; 67 | const uint16_t PROGMEM artsey_k[] = {BASE_2_2,BASE_2_4,COMBO_END}; 68 | const uint16_t PROGMEM artsey_b[] = {BASE_2_1,BASE_2_4,COMBO_END}; 69 | const uint16_t PROGMEM artsey_w[] = {BASE_1_1,BASE_1_4,COMBO_END}; 70 | const uint16_t PROGMEM artsey_n[] = {BASE_2_3,BASE_2_4,COMBO_END}; 71 | const uint16_t PROGMEM artsey_f[] = {BASE_1_1,BASE_1_2,COMBO_END}; 72 | const uint16_t PROGMEM artsey_x[] = {BASE_1_2,BASE_1_3,BASE_1_4,COMBO_END}; 73 | const uint16_t PROGMEM artsey_j[] = {BASE_1_3,BASE_1_4,COMBO_END}; 74 | const uint16_t PROGMEM artsey_m[] = {BASE_2_2,BASE_2_3,BASE_2_4,COMBO_END}; 75 | const uint16_t PROGMEM artsey_p[] = {BASE_2_1,BASE_2_3,BASE_2_4,COMBO_END}; 76 | const uint16_t PROGMEM artsey_v[] = {BASE_1_2,BASE_1_4,COMBO_END}; 77 | const uint16_t PROGMEM artsey_l[] = {BASE_2_1,BASE_2_2,BASE_2_3,COMBO_END}; 78 | const uint16_t PROGMEM artsey_z[] = {BASE_1_1,BASE_1_2,BASE_1_3,BASE_1_4,COMBO_END}; 79 | const uint16_t PROGMEM artsey_d[] = {BASE_1_1,BASE_1_2,BASE_1_3,COMBO_END}; 80 | const uint16_t PROGMEM artsey_g[] = {BASE_1_2,BASE_1_3,COMBO_END}; 81 | const uint16_t PROGMEM artsey_space[] = {BASE_2_1,BASE_2_2,BASE_2_3,BASE_2_4,COMBO_END}; 82 | const uint16_t PROGMEM artsey_space_2[] = {NAV_2_1,NAV_2_2,NAV_2_3,NAV_2_4,COMBO_END}; 83 | const uint16_t PROGMEM artsey_backspace[] = {BASE_2_1,BASE_1_2,COMBO_END}; 84 | const uint16_t PROGMEM artsey_backspace_2[] = {NAV_2_1,NAV_1_2,COMBO_END}; 85 | const uint16_t PROGMEM artsey_del[] = {BASE_1_2,BASE_2_3,COMBO_END}; 86 | const uint16_t PROGMEM artsey_del_2[] = {NAV_1_2,NAV_2_3,COMBO_END}; 87 | const uint16_t PROGMEM artsey_enter[] = {BASE_1_1,BASE_2_1,COMBO_END}; 88 | const uint16_t PROGMEM artsey_enter_2[] = {NAV_1_1,NAV_2_1,COMBO_END}; 89 | const uint16_t PROGMEM artsey_escape[] = {BASE_1_1,BASE_1_2,BASE_2_4,COMBO_END}; 90 | const uint16_t PROGMEM artsey_escape_2[] = {NAV_1_1,NAV_1_2,NAV_2_4,COMBO_END}; 91 | const uint16_t PROGMEM artsey_quote[] = {BASE_1_2,BASE_2_2,COMBO_END}; 92 | const uint16_t PROGMEM artsey_bang[] = {BASE_1_3,BASE_2_3,COMBO_END}; 93 | const uint16_t PROGMEM artsey_quest[] = {BASE_1_4,BASE_2_4,COMBO_END}; 94 | const uint16_t PROGMEM artsey_period[] = {BASE_1_1,BASE_2_3,COMBO_END}; 95 | const uint16_t PROGMEM artsey_comma[] = {BASE_1_1,BASE_2_2,COMBO_END}; 96 | const uint16_t PROGMEM artsey_slash[] = {BASE_1_1,BASE_2_4,COMBO_END}; 97 | const uint16_t PROGMEM artsey_tab[] = {BASE_1_1,BASE_1_2,BASE_1_3,BASE_2_4,COMBO_END}; 98 | const uint16_t PROGMEM artsey_os_shift[] = {BASE_2_1,BASE_1_2,BASE_1_3,BASE_1_4,COMBO_END}; 99 | const uint16_t PROGMEM artsey_ctrl[] = {BASE_1_4,BASE_2_1,COMBO_END}; 100 | const uint16_t PROGMEM artsey_ctrl_2[] = {NAV_1_4,NAV_2_1,COMBO_END}; 101 | const uint16_t PROGMEM artsey_ctrl_3[] = {MOU_1_4,MOU_2_1,COMBO_END}; 102 | const uint16_t PROGMEM artsey_gui[] = {BASE_1_4,BASE_2_2,COMBO_END}; 103 | const uint16_t PROGMEM artsey_gui_2[] = {NAV_1_4,NAV_2_2,COMBO_END}; 104 | const uint16_t PROGMEM artsey_gui_3[] = {MOU_1_4,MOU_2_2,COMBO_END}; 105 | const uint16_t PROGMEM artsey_alt[] = {BASE_1_4,BASE_2_3,COMBO_END}; 106 | const uint16_t PROGMEM artsey_alt_2[] = {NAV_1_4,NAV_2_3,COMBO_END}; 107 | const uint16_t PROGMEM artsey_alt_3[] = {MOU_1_4,MOU_2_3,COMBO_END}; 108 | const uint16_t PROGMEM artsey_shift[] = {BASE_1_1,BASE_2_2,BASE_2_3,BASE_2_4,COMBO_END}; 109 | const uint16_t PROGMEM artsey_shift2[] = {NAV_1_1,NAV_2_2,NAV_2_3,NAV_2_4,COMBO_END}; 110 | const uint16_t PROGMEM arsey_panic[] = {BASE_1_1,BASE_1_2,BASE_1_3,BASE_1_4,BASE_2_1,BASE_2_2,BASE_2_3,BASE_2_4,COMBO_END}; 111 | const uint16_t PROGMEM arsey_panic_2[] = {NAV_1_1,NAV_1_2,NAV_1_3,NAV_1_4,NAV_2_1,NAV_2_2,NAV_2_3,NAV_2_4,COMBO_END}; 112 | const uint16_t PROGMEM arsey_panic_3[] = {MOU_1_1,MOU_1_2,MOU_1_3,MOU_1_4,MOU_2_1,MOU_2_2,MOU_2_3,MOU_2_4,COMBO_END}; 113 | const uint16_t PROGMEM artsey_nav[] = {BASE_1_2,BASE_2_1,BASE_2_3,COMBO_END}; 114 | const uint16_t PROGMEM artsey_main1[] = {NAV_1_2,NAV_2_1,NAV_2_3,COMBO_END}; 115 | const uint16_t PROGMEM artsey_mou[] = {BASE_1_1,BASE_1_3,BASE_2_2,COMBO_END}; 116 | const uint16_t PROGMEM artsey_main2[] = {MOU_1_1,MOU_1_3,MOU_2_2,COMBO_END}; 117 | const uint16_t PROGMEM artsey_7[] = {NUM_1_1,NUM_1_2,COMBO_END}; 118 | const uint16_t PROGMEM artsey_8[] = {NUM_1_2,NUM_1_3,COMBO_END}; 119 | const uint16_t PROGMEM artsey_9[] = {NUM_2_1,NUM_2_2,COMBO_END}; 120 | const uint16_t PROGMEM artsey_0[] = {NUM_2_2,NUM_2_3,COMBO_END}; 121 | combo_t key_combos[] = { 122 | [ARTSEY_H] = COMBO_ACTION(artsey_h), 123 | [ARTSEY_Q] = COMBO_ACTION(artsey_q), 124 | [ARTSEY_U] = COMBO_ACTION(artsey_u), 125 | [ARTSEY_C] = COMBO_ACTION(artsey_c), 126 | [ARTSEY_K] = COMBO_ACTION(artsey_k), 127 | [ARTSEY_B] = COMBO_ACTION(artsey_b), 128 | [ARTSEY_W] = COMBO_ACTION(artsey_w), 129 | [ARTSEY_N] = COMBO_ACTION(artsey_n), 130 | [ARTSEY_F] = COMBO_ACTION(artsey_f), 131 | [ARTSEY_X] = COMBO_ACTION(artsey_x), 132 | [ARTSEY_J] = COMBO_ACTION(artsey_j), 133 | [ARTSEY_M] = COMBO_ACTION(artsey_m), 134 | [ARTSEY_P] = COMBO_ACTION(artsey_p), 135 | [ARTSEY_V] = COMBO_ACTION(artsey_v), 136 | [ARTSEY_L] = COMBO_ACTION(artsey_l), 137 | [ARTSEY_Z] = COMBO_ACTION(artsey_z), 138 | [ARTSEY_D] = COMBO_ACTION(artsey_d), 139 | [ARTSEY_G] = COMBO_ACTION(artsey_g), 140 | [ARTSEY_SPACE] = COMBO_ACTION(artsey_space), 141 | [ARTSEY_SPACE_2] = COMBO_ACTION(artsey_space_2), 142 | [ARTSEY_BACKSPACE] = COMBO_ACTION(artsey_backspace), 143 | [ARTSEY_BACKSPACE_2] = COMBO_ACTION(artsey_backspace_2), 144 | [ARTSEY_DEL] = COMBO_ACTION(artsey_del), 145 | [ARTSEY_DEL_2] = COMBO_ACTION(artsey_del_2), 146 | [ARTSEY_ENTER] = COMBO_ACTION(artsey_enter), 147 | [ARTSEY_ENTER_2] = COMBO_ACTION(artsey_enter_2), 148 | [ARTSEY_ESCAPE] = COMBO_ACTION(artsey_escape), 149 | [ARTSEY_ESCAPE_2] = COMBO_ACTION(artsey_escape_2), 150 | [ARTSEY_QUOTE] = COMBO_ACTION(artsey_quote), 151 | [ARTSEY_BANG] = COMBO_ACTION(artsey_bang), 152 | [ARTSEY_QUEST] = COMBO_ACTION(artsey_quest), 153 | [ARTSEY_PERIOD] = COMBO_ACTION(artsey_period), 154 | [ARTSEY_COMMA] = COMBO_ACTION(artsey_comma), 155 | [ARTSEY_SLASH] = COMBO_ACTION(artsey_slash), 156 | [ARTSEY_TAB] = COMBO_ACTION(artsey_tab), 157 | [ARTSEY_OS_SHIFT] = COMBO_ACTION(artsey_os_shift), 158 | [ARTSEY_CTRL] = COMBO_ACTION(artsey_ctrl), 159 | [ARTSEY_CTRL_2] = COMBO_ACTION(artsey_ctrl_2), 160 | [ARTSEY_CTRL_3] = COMBO_ACTION(artsey_ctrl_3), 161 | [ARTSEY_GUI] = COMBO_ACTION(artsey_gui), 162 | [ARTSEY_GUI_2] = COMBO_ACTION(artsey_gui_2), 163 | [ARTSEY_GUI_3] = COMBO_ACTION(artsey_gui_3), 164 | [ARTSEY_ALT] = COMBO_ACTION(artsey_alt), 165 | [ARTSEY_ALT_2] = COMBO_ACTION(artsey_alt_2), 166 | [ARTSEY_ALT_3] = COMBO_ACTION(artsey_alt_3), 167 | [ARTSEY_SHIFT] = COMBO_ACTION(artsey_shift), 168 | [ARTSEY_SHIFT2] = COMBO_ACTION(artsey_shift2), 169 | [ARSEY_PANIC] = COMBO_ACTION(arsey_panic), 170 | [ARSEY_PANIC_2] = COMBO_ACTION(arsey_panic_2), 171 | [ARSEY_PANIC_3] = COMBO_ACTION(arsey_panic_3), 172 | [ARTSEY_NAV] = COMBO_ACTION(artsey_nav), 173 | [ARTSEY_MAIN1] = COMBO_ACTION(artsey_main1), 174 | [ARTSEY_MOU] = COMBO_ACTION(artsey_mou), 175 | [ARTSEY_MAIN2] = COMBO_ACTION(artsey_main2), 176 | [ARTSEY_7] = COMBO_ACTION(artsey_7), 177 | [ARTSEY_8] = COMBO_ACTION(artsey_8), 178 | [ARTSEY_9] = COMBO_ACTION(artsey_9), 179 | [ARTSEY_0] = COMBO_ACTION(artsey_0), 180 | }; 181 | void process_combo_event(uint16_t combo_index, bool pressed) { 182 | switch(combo_index) { 183 | case ARTSEY_H: 184 | if (pressed) {SEND_STRING("h");} 185 | break; 186 | case ARTSEY_Q: 187 | if (pressed) {SEND_STRING("q");} 188 | break; 189 | case ARTSEY_U: 190 | if (pressed) {SEND_STRING("u");} 191 | break; 192 | case ARTSEY_C: 193 | if (pressed) {SEND_STRING("c");} 194 | break; 195 | case ARTSEY_K: 196 | if (pressed) {SEND_STRING("k");} 197 | break; 198 | case ARTSEY_B: 199 | if (pressed) {SEND_STRING("b");} 200 | break; 201 | case ARTSEY_W: 202 | if (pressed) {SEND_STRING("w");} 203 | break; 204 | case ARTSEY_N: 205 | if (pressed) {SEND_STRING("n");} 206 | break; 207 | case ARTSEY_F: 208 | if (pressed) {SEND_STRING("f");} 209 | break; 210 | case ARTSEY_X: 211 | if (pressed) {SEND_STRING("x");} 212 | break; 213 | case ARTSEY_J: 214 | if (pressed) {SEND_STRING("j");} 215 | break; 216 | case ARTSEY_M: 217 | if (pressed) {SEND_STRING("m");} 218 | break; 219 | case ARTSEY_P: 220 | if (pressed) {SEND_STRING("p");} 221 | break; 222 | case ARTSEY_V: 223 | if (pressed) {SEND_STRING("v");} 224 | break; 225 | case ARTSEY_L: 226 | if (pressed) {SEND_STRING("l");} 227 | break; 228 | case ARTSEY_Z: 229 | if (pressed) {SEND_STRING("z");} 230 | break; 231 | case ARTSEY_D: 232 | if (pressed) {SEND_STRING("d");} 233 | break; 234 | case ARTSEY_G: 235 | if (pressed) {SEND_STRING("g");} 236 | break; 237 | case ARTSEY_SPACE: 238 | if (pressed) {SEND_STRING(" ");} 239 | break; 240 | case ARTSEY_SPACE_2: 241 | if (pressed) {SEND_STRING(" ");} 242 | break; 243 | case ARTSEY_BACKSPACE: 244 | if (pressed) {SEND_STRING(SS_TAP(X_BSPC));} 245 | break; 246 | case ARTSEY_BACKSPACE_2: 247 | if (pressed) {SEND_STRING(SS_TAP(X_BSPC));} 248 | break; 249 | case ARTSEY_DEL: 250 | if (pressed) {SEND_STRING(SS_TAP(X_DEL));} 251 | break; 252 | case ARTSEY_DEL_2: 253 | if (pressed) {SEND_STRING(SS_TAP(X_DEL));} 254 | break; 255 | case ARTSEY_ENTER: 256 | if (pressed) {SEND_STRING(SS_TAP(X_ENTER));} 257 | break; 258 | case ARTSEY_ENTER_2: 259 | if (pressed) {SEND_STRING(SS_TAP(X_ENTER));} 260 | break; 261 | case ARTSEY_ESCAPE: 262 | if (pressed) {SEND_STRING(SS_TAP(X_ESC));} 263 | break; 264 | case ARTSEY_ESCAPE_2: 265 | if (pressed) {SEND_STRING(SS_TAP(X_ESC));} 266 | break; 267 | case ARTSEY_QUOTE: 268 | if (pressed) {SEND_STRING("'");} 269 | break; 270 | case ARTSEY_BANG: 271 | if (pressed) {SEND_STRING("!");} 272 | break; 273 | case ARTSEY_QUEST: 274 | if (pressed) {SEND_STRING("?");} 275 | break; 276 | case ARTSEY_PERIOD: 277 | if (pressed) {SEND_STRING(".");} 278 | break; 279 | case ARTSEY_COMMA: 280 | if (pressed) {SEND_STRING(",");} 281 | break; 282 | case ARTSEY_SLASH: 283 | if (pressed) {SEND_STRING("/");} 284 | break; 285 | case ARTSEY_TAB: 286 | if (pressed) {SEND_STRING(SS_TAP(X_TAB));} 287 | break; 288 | case ARTSEY_OS_SHIFT: 289 | if (pressed) {add_oneshot_mods(MOD_BIT(KC_LSFT));} 290 | break; 291 | case ARTSEY_CTRL: 292 | if (pressed) { 293 | if (get_mods() & MOD_MASK_CTRL){ 294 | del_mods(MOD_MASK_CTRL);; 295 | } else { 296 | add_mods(MOD_MASK_CTRL); } ;} 297 | break; 298 | case ARTSEY_CTRL_2: 299 | if (pressed) { 300 | if (get_mods() & MOD_MASK_CTRL){ 301 | del_mods(MOD_MASK_CTRL);; 302 | } else { 303 | add_mods(MOD_MASK_CTRL); } ;} 304 | break; 305 | case ARTSEY_CTRL_3: 306 | if (pressed) { 307 | if (get_mods() & MOD_MASK_CTRL){ 308 | del_mods(MOD_MASK_CTRL);; 309 | } else { 310 | add_mods(MOD_MASK_CTRL); } ;} 311 | break; 312 | case ARTSEY_GUI: 313 | if (pressed) { 314 | if (get_mods() & MOD_MASK_GUI){ 315 | del_mods(MOD_MASK_GUI);; 316 | } else { 317 | add_mods(MOD_MASK_GUI); } ;} 318 | break; 319 | case ARTSEY_GUI_2: 320 | if (pressed) { 321 | if (get_mods() & MOD_MASK_GUI){ 322 | del_mods(MOD_MASK_GUI);; 323 | } else { 324 | add_mods(MOD_MASK_GUI); } ;} 325 | break; 326 | case ARTSEY_GUI_3: 327 | if (pressed) { 328 | if (get_mods() & MOD_MASK_GUI){ 329 | del_mods(MOD_MASK_GUI);; 330 | } else { 331 | add_mods(MOD_MASK_GUI); } ;} 332 | break; 333 | case ARTSEY_ALT: 334 | if (pressed) { 335 | if (get_mods() & MOD_MASK_ALT){ 336 | del_mods(MOD_MASK_ALT);; 337 | } else { 338 | add_mods(MOD_MASK_ALT); } ;} 339 | break; 340 | case ARTSEY_ALT_2: 341 | if (pressed) { 342 | if (get_mods() & MOD_MASK_ALT){ 343 | del_mods(MOD_MASK_ALT);; 344 | } else { 345 | add_mods(MOD_MASK_ALT); } ;} 346 | break; 347 | case ARTSEY_ALT_3: 348 | if (pressed) { 349 | if (get_mods() & MOD_MASK_ALT){ 350 | del_mods(MOD_MASK_ALT);; 351 | } else { 352 | add_mods(MOD_MASK_ALT); } ;} 353 | break; 354 | case ARTSEY_SHIFT: 355 | if (pressed) { 356 | if (get_mods() & MOD_MASK_SHIFT){ 357 | del_mods(MOD_MASK_SHIFT);; 358 | } else { 359 | add_mods(MOD_MASK_SHIFT); } ;} 360 | break; 361 | case ARTSEY_SHIFT2: 362 | if (pressed) { 363 | if (get_mods() & MOD_MASK_SHIFT){ 364 | del_mods(MOD_MASK_SHIFT);; 365 | } else { 366 | add_mods(MOD_MASK_SHIFT); } ;} 367 | break; 368 | case ARSEY_PANIC: 369 | if (pressed) {clear_mods(); 370 | layer_move(_ART_BASE);;} 371 | break; 372 | case ARSEY_PANIC_2: 373 | if (pressed) {clear_mods(); 374 | layer_move(_ART_BASE);;} 375 | break; 376 | case ARSEY_PANIC_3: 377 | if (pressed) {clear_mods(); 378 | layer_move(_ART_BASE);;} 379 | break; 380 | case ARTSEY_NAV: 381 | if (pressed) {layer_move(_ART_NAV);} 382 | break; 383 | case ARTSEY_MAIN1: 384 | if (pressed) {layer_move(_ART_BASE);} 385 | break; 386 | case ARTSEY_MOU: 387 | if (pressed) {layer_move(_ART_MOU);} 388 | break; 389 | case ARTSEY_MAIN2: 390 | if (pressed) {layer_move(_ART_BASE);} 391 | break; 392 | case ARTSEY_7: 393 | if (pressed) {SEND_STRING("7");} 394 | break; 395 | case ARTSEY_8: 396 | if (pressed) {SEND_STRING("8");} 397 | break; 398 | case ARTSEY_9: 399 | if (pressed) {SEND_STRING("9");} 400 | break; 401 | case ARTSEY_0: 402 | if (pressed) {SEND_STRING("0");} 403 | break; 404 | } 405 | } -------------------------------------------------------------------------------- /LICENSE-CC-Attribution-NonCommercial-ShareAlike-4.0-International.txt: -------------------------------------------------------------------------------- 1 | Attribution-NonCommercial-ShareAlike 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International 58 | Public License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-NonCommercial-ShareAlike 4.0 International Public License 63 | ("Public License"). To the extent this Public License may be 64 | interpreted as a contract, You are granted the Licensed Rights in 65 | consideration of Your acceptance of these terms and conditions, and the 66 | Licensor grants You such rights in consideration of benefits the 67 | Licensor receives from making the Licensed Material available under 68 | these terms and conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. BY-NC-SA Compatible License means a license listed at 88 | creativecommons.org/compatiblelicenses, approved by Creative 89 | Commons as essentially the equivalent of this Public License. 90 | 91 | d. Copyright and Similar Rights means copyright and/or similar rights 92 | closely related to copyright including, without limitation, 93 | performance, broadcast, sound recording, and Sui Generis Database 94 | Rights, without regard to how the rights are labeled or 95 | categorized. For purposes of this Public License, the rights 96 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 | Rights. 98 | 99 | e. Effective Technological Measures means those measures that, in the 100 | absence of proper authority, may not be circumvented under laws 101 | fulfilling obligations under Article 11 of the WIPO Copyright 102 | Treaty adopted on December 20, 1996, and/or similar international 103 | agreements. 104 | 105 | f. Exceptions and Limitations means fair use, fair dealing, and/or 106 | any other exception or limitation to Copyright and Similar Rights 107 | that applies to Your use of the Licensed Material. 108 | 109 | g. License Elements means the license attributes listed in the name 110 | of a Creative Commons Public License. The License Elements of this 111 | Public License are Attribution, NonCommercial, and ShareAlike. 112 | 113 | h. Licensed Material means the artistic or literary work, database, 114 | or other material to which the Licensor applied this Public 115 | License. 116 | 117 | i. Licensed Rights means the rights granted to You subject to the 118 | terms and conditions of this Public License, which are limited to 119 | all Copyright and Similar Rights that apply to Your use of the 120 | Licensed Material and that the Licensor has authority to license. 121 | 122 | j. Licensor means the individual(s) or entity(ies) granting rights 123 | under this Public License. 124 | 125 | k. NonCommercial means not primarily intended for or directed towards 126 | commercial advantage or monetary compensation. For purposes of 127 | this Public License, the exchange of the Licensed Material for 128 | other material subject to Copyright and Similar Rights by digital 129 | file-sharing or similar means is NonCommercial provided there is 130 | no payment of monetary compensation in connection with the 131 | exchange. 132 | 133 | l. Share means to provide material to the public by any means or 134 | process that requires permission under the Licensed Rights, such 135 | as reproduction, public display, public performance, distribution, 136 | dissemination, communication, or importation, and to make material 137 | available to the public including in ways that members of the 138 | public may access the material from a place and at a time 139 | individually chosen by them. 140 | 141 | m. Sui Generis Database Rights means rights other than copyright 142 | resulting from Directive 96/9/EC of the European Parliament and of 143 | the Council of 11 March 1996 on the legal protection of databases, 144 | as amended and/or succeeded, as well as other essentially 145 | equivalent rights anywhere in the world. 146 | 147 | n. You means the individual or entity exercising the Licensed Rights 148 | under this Public License. Your has a corresponding meaning. 149 | 150 | 151 | Section 2 -- Scope. 152 | 153 | a. License grant. 154 | 155 | 1. Subject to the terms and conditions of this Public License, 156 | the Licensor hereby grants You a worldwide, royalty-free, 157 | non-sublicensable, non-exclusive, irrevocable license to 158 | exercise the Licensed Rights in the Licensed Material to: 159 | 160 | a. reproduce and Share the Licensed Material, in whole or 161 | in part, for NonCommercial purposes only; and 162 | 163 | b. produce, reproduce, and Share Adapted Material for 164 | NonCommercial purposes only. 165 | 166 | 2. Exceptions and Limitations. For the avoidance of doubt, where 167 | Exceptions and Limitations apply to Your use, this Public 168 | License does not apply, and You do not need to comply with 169 | its terms and conditions. 170 | 171 | 3. Term. The term of this Public License is specified in Section 172 | 6(a). 173 | 174 | 4. Media and formats; technical modifications allowed. The 175 | Licensor authorizes You to exercise the Licensed Rights in 176 | all media and formats whether now known or hereafter created, 177 | and to make technical modifications necessary to do so. The 178 | Licensor waives and/or agrees not to assert any right or 179 | authority to forbid You from making technical modifications 180 | necessary to exercise the Licensed Rights, including 181 | technical modifications necessary to circumvent Effective 182 | Technological Measures. For purposes of this Public License, 183 | simply making modifications authorized by this Section 2(a) 184 | (4) never produces Adapted Material. 185 | 186 | 5. Downstream recipients. 187 | 188 | a. Offer from the Licensor -- Licensed Material. Every 189 | recipient of the Licensed Material automatically 190 | receives an offer from the Licensor to exercise the 191 | Licensed Rights under the terms and conditions of this 192 | Public License. 193 | 194 | b. Additional offer from the Licensor -- Adapted Material. 195 | Every recipient of Adapted Material from You 196 | automatically receives an offer from the Licensor to 197 | exercise the Licensed Rights in the Adapted Material 198 | under the conditions of the Adapter's License You apply. 199 | 200 | c. No downstream restrictions. You may not offer or impose 201 | any additional or different terms or conditions on, or 202 | apply any Effective Technological Measures to, the 203 | Licensed Material if doing so restricts exercise of the 204 | Licensed Rights by any recipient of the Licensed 205 | Material. 206 | 207 | 6. No endorsement. Nothing in this Public License constitutes or 208 | may be construed as permission to assert or imply that You 209 | are, or that Your use of the Licensed Material is, connected 210 | with, or sponsored, endorsed, or granted official status by, 211 | the Licensor or others designated to receive attribution as 212 | provided in Section 3(a)(1)(A)(i). 213 | 214 | b. Other rights. 215 | 216 | 1. Moral rights, such as the right of integrity, are not 217 | licensed under this Public License, nor are publicity, 218 | privacy, and/or other similar personality rights; however, to 219 | the extent possible, the Licensor waives and/or agrees not to 220 | assert any such rights held by the Licensor to the limited 221 | extent necessary to allow You to exercise the Licensed 222 | Rights, but not otherwise. 223 | 224 | 2. Patent and trademark rights are not licensed under this 225 | Public License. 226 | 227 | 3. To the extent possible, the Licensor waives any right to 228 | collect royalties from You for the exercise of the Licensed 229 | Rights, whether directly or through a collecting society 230 | under any voluntary or waivable statutory or compulsory 231 | licensing scheme. In all other cases the Licensor expressly 232 | reserves any right to collect such royalties, including when 233 | the Licensed Material is used other than for NonCommercial 234 | purposes. 235 | 236 | 237 | Section 3 -- License Conditions. 238 | 239 | Your exercise of the Licensed Rights is expressly made subject to the 240 | following conditions. 241 | 242 | a. Attribution. 243 | 244 | 1. If You Share the Licensed Material (including in modified 245 | form), You must: 246 | 247 | a. retain the following if it is supplied by the Licensor 248 | with the Licensed Material: 249 | 250 | i. identification of the creator(s) of the Licensed 251 | Material and any others designated to receive 252 | attribution, in any reasonable manner requested by 253 | the Licensor (including by pseudonym if 254 | designated); 255 | 256 | ii. a copyright notice; 257 | 258 | iii. a notice that refers to this Public License; 259 | 260 | iv. a notice that refers to the disclaimer of 261 | warranties; 262 | 263 | v. a URI or hyperlink to the Licensed Material to the 264 | extent reasonably practicable; 265 | 266 | b. indicate if You modified the Licensed Material and 267 | retain an indication of any previous modifications; and 268 | 269 | c. indicate the Licensed Material is licensed under this 270 | Public License, and include the text of, or the URI or 271 | hyperlink to, this Public License. 272 | 273 | 2. You may satisfy the conditions in Section 3(a)(1) in any 274 | reasonable manner based on the medium, means, and context in 275 | which You Share the Licensed Material. For example, it may be 276 | reasonable to satisfy the conditions by providing a URI or 277 | hyperlink to a resource that includes the required 278 | information. 279 | 3. If requested by the Licensor, You must remove any of the 280 | information required by Section 3(a)(1)(A) to the extent 281 | reasonably practicable. 282 | 283 | b. ShareAlike. 284 | 285 | In addition to the conditions in Section 3(a), if You Share 286 | Adapted Material You produce, the following conditions also apply. 287 | 288 | 1. The Adapter's License You apply must be a Creative Commons 289 | license with the same License Elements, this version or 290 | later, or a BY-NC-SA Compatible License. 291 | 292 | 2. You must include the text of, or the URI or hyperlink to, the 293 | Adapter's License You apply. You may satisfy this condition 294 | in any reasonable manner based on the medium, means, and 295 | context in which You Share Adapted Material. 296 | 297 | 3. You may not offer or impose any additional or different terms 298 | or conditions on, or apply any Effective Technological 299 | Measures to, Adapted Material that restrict exercise of the 300 | rights granted under the Adapter's License You apply. 301 | 302 | 303 | Section 4 -- Sui Generis Database Rights. 304 | 305 | Where the Licensed Rights include Sui Generis Database Rights that 306 | apply to Your use of the Licensed Material: 307 | 308 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 309 | to extract, reuse, reproduce, and Share all or a substantial 310 | portion of the contents of the database for NonCommercial purposes 311 | only; 312 | 313 | b. if You include all or a substantial portion of the database 314 | contents in a database in which You have Sui Generis Database 315 | Rights, then the database in which You have Sui Generis Database 316 | Rights (but not its individual contents) is Adapted Material, 317 | including for purposes of Section 3(b); and 318 | 319 | c. You must comply with the conditions in Section 3(a) if You Share 320 | all or a substantial portion of the contents of the database. 321 | 322 | For the avoidance of doubt, this Section 4 supplements and does not 323 | replace Your obligations under this Public License where the Licensed 324 | Rights include other Copyright and Similar Rights. 325 | 326 | 327 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 328 | 329 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 330 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 331 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 332 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 333 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 334 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 335 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 336 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 337 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 338 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 339 | 340 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 341 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 342 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 343 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 344 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 345 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 346 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 347 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 348 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 349 | 350 | c. The disclaimer of warranties and limitation of liability provided 351 | above shall be interpreted in a manner that, to the extent 352 | possible, most closely approximates an absolute disclaimer and 353 | waiver of all liability. 354 | 355 | 356 | Section 6 -- Term and Termination. 357 | 358 | a. This Public License applies for the term of the Copyright and 359 | Similar Rights licensed here. However, if You fail to comply with 360 | this Public License, then Your rights under this Public License 361 | terminate automatically. 362 | 363 | b. Where Your right to use the Licensed Material has terminated under 364 | Section 6(a), it reinstates: 365 | 366 | 1. automatically as of the date the violation is cured, provided 367 | it is cured within 30 days of Your discovery of the 368 | violation; or 369 | 370 | 2. upon express reinstatement by the Licensor. 371 | 372 | For the avoidance of doubt, this Section 6(b) does not affect any 373 | right the Licensor may have to seek remedies for Your violations 374 | of this Public License. 375 | 376 | c. For the avoidance of doubt, the Licensor may also offer the 377 | Licensed Material under separate terms or conditions or stop 378 | distributing the Licensed Material at any time; however, doing so 379 | will not terminate this Public License. 380 | 381 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 382 | License. 383 | 384 | 385 | Section 7 -- Other Terms and Conditions. 386 | 387 | a. The Licensor shall not be bound by any additional or different 388 | terms or conditions communicated by You unless expressly agreed. 389 | 390 | b. Any arrangements, understandings, or agreements regarding the 391 | Licensed Material not stated herein are separate from and 392 | independent of the terms and conditions of this Public License. 393 | 394 | 395 | Section 8 -- Interpretation. 396 | 397 | a. For the avoidance of doubt, this Public License does not, and 398 | shall not be interpreted to, reduce, limit, restrict, or impose 399 | conditions on any use of the Licensed Material that could lawfully 400 | be made without permission under this Public License. 401 | 402 | b. To the extent possible, if any provision of this Public License is 403 | deemed unenforceable, it shall be automatically reformed to the 404 | minimum extent necessary to make it enforceable. If the provision 405 | cannot be reformed, it shall be severed from this Public License 406 | without affecting the enforceability of the remaining terms and 407 | conditions. 408 | 409 | c. No term or condition of this Public License will be waived and no 410 | failure to comply consented to unless expressly agreed to by the 411 | Licensor. 412 | 413 | d. Nothing in this Public License constitutes or may be interpreted 414 | as a limitation upon, or waiver of, any privileges and immunities 415 | that apply to the Licensor or You, including from the legal 416 | processes of any jurisdiction or authority. 417 | 418 | ======================================================================= 419 | 420 | Creative Commons is not a party to its public 421 | licenses. Notwithstanding, Creative Commons may elect to apply one of 422 | its public licenses to material it publishes and in those instances 423 | will be considered the “Licensor.” The text of the Creative Commons 424 | public licenses is dedicated to the public domain under the CC0 Public 425 | Domain Dedication. Except for the limited purpose of indicating that 426 | material is shared under a Creative Commons public license or as 427 | otherwise permitted by the Creative Commons policies published at 428 | creativecommons.org/policies, Creative Commons does not authorize the 429 | use of the trademark "Creative Commons" or any other trademark or logo 430 | of Creative Commons without its prior written consent including, 431 | without limitation, in connection with any unauthorized modifications 432 | to any of its public licenses or any other arrangements, 433 | understandings, or agreements concerning use of licensed material. For 434 | the avoidance of doubt, this paragraph does not form part of the 435 | public licenses. 436 | 437 | Creative Commons may be contacted at creativecommons.org. 438 | 439 | --------------------------------------------------------------------------------