aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--keyboards/planck/keymaps/callum/config.h7
-rw-r--r--keyboards/planck/keymaps/callum/keymap.c526
-rw-r--r--keyboards/planck/keymaps/callum/readme.md27
-rw-r--r--keyboards/planck/keymaps/callum/rules.mk2
4 files changed, 249 insertions, 313 deletions
diff --git a/keyboards/planck/keymaps/callum/config.h b/keyboards/planck/keymaps/callum/config.h
index e66db1d7e..e69de29bb 100644
--- a/keyboards/planck/keymaps/callum/config.h
+++ b/keyboards/planck/keymaps/callum/config.h
@@ -1,7 +0,0 @@
-#define MOUSEKEY_DELAY 0
-#define MOUSEKEY_INTERVAL 16
-#define MOUSEKEY_MAX_SPEED 20
-#define MOUSEKEY_TIME_TO_MAX 100
-#define MOUSEKEY_WHEEL_DELAY 0
-#define MOUSEKEY_WHEEL_MAX_SPEED 1
-#define MOUSEKEY_WHEEL_TIME_TO_MAX 100
diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c
index 08d0c69b8..80dab2220 100644
--- a/keyboards/planck/keymaps/callum/keymap.c
+++ b/keyboards/planck/keymaps/callum/keymap.c
@@ -1,331 +1,259 @@
#include "planck.h"
#include "action_layer.h"
-extern keymap_config_t keymap_config;
+#define a KC_A
+#define b KC_B
+#define c KC_C
+#define d KC_D
+#define e KC_E
+#define f KC_F
+#define g KC_G
+#define h KC_H
+#define i KC_I
+#define j KC_J
+#define k KC_K
pre { line-height: 125%; margin: 0; } td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #ffffff; } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-wei+#define f7 KC_F7
+#define f8 KC_F8
+#define f9 KC_F9
+#define f10 KC_F10
+#define f11 KC_F11
+#define f12 KC_F12
+#define f13 KC_F13
+#define f14 KC_F14
+#define f15 KC_F15
+#define f16 KC_F16
+#define f17 KC_F17
+#define f18 KC_F18
+#define f19 KC_F19
+#define f20 KC_F20
+
+#define mute KC_MUTE
+#define next KC_MNXT
+#define play KC_MPLY
+#define prev KC_MPRV
+#define vold KC_F11
+#define volu KC_F12
+
+#define symb MO(SYMB)
+#define move MO(MOVE)
+#define func MO(FUNC)
+
+#define rset RESET
+#define powr KC_POWER
+
+#define ____ KC_TRNS
+#define xxxx KC_NO
-#define AC(X) A(C(X))
-#define SC(X) S(C(X))
+extern keymap_config_t keymap_config;
enum planck_layers {
- _COLEMAK,
- _QWERTY,
- _SYMB,
- _MOVE,
- _FUNC,
- _MOUSE,
-};
-
-enum planck_keycodes {
- COLEMAK = SAFE_RANGE,
- QWERTY,
+ BASE,
SYMB,
MOVE,
FUNC,
- MOUSE,
};
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
- /* COLEMAK
- * ,-----------------------------------------------------------------------.
- * |Tab | Q | W | F | P | G | J | L | U | Y | ; | - |
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * |Bksp | A | R | S | T | D | H | N | E | I | O | ' |
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * |Shift| Z | X | C | V | B | K | M | , | . | / |Shift|
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * |Func |Ctrl | Alt |Super|Symb |Enter|Space|Move |Super| Alt |Ctrl |Func |
- * `-----------------------------------------------------------------------'
- */
- [_COLEMAK] = LAYOUT_planck_grid(
- KC_TAB, KC_Q, KC_W, KC_F,
- KC_P, KC_G, KC_J, KC_L,
- KC_U, KC_Y, KC_SCLN, KC_MINS,
-
- KC_BSPC, KC_A, KC_R, KC_S,
- KC_T, KC_D, KC_H, KC_N,
- KC_E, KC_I, KC_O, KC_QUOT,
-
- KC_LSFT, KC_Z, KC_X, KC_C,
- KC_V, KC_B, KC_K, KC_M,
- KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+enum planck_keycodes {
+ ampr = SAFE_RANGE,
+ astr,
+ at,
+ bsls,
+ circ,
+ dlr,
+ eql,
+ exlm,
+ grv,
+ hash,
+ lbrc,
+ lcbr,
+ lprn,
+ perc,
+ pipe,
+ plus,
+ rbrc,
+ rcbr,
+ rprn,
+ tild,
+
+ cmd,
+};
- FUNC, KC_LCTL, KC_LALT, KC_LGUI,
- SYMB, KC_ENT, KC_SPC, MOVE,
- KC_RGUI, KC_RALT, KC_RCTL, FUNC
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = LAYOUT_planck_grid(
+ tab, q, // tlb entry is inserted. // pte_val.p = 0: // once tlb entry is inserted, so // this entry is created. But tlb // purge is isseued, so this // virtual address need not to be // purged. unsigned long vaddr; // virtual address unsigned long rid; // rid cpumask_t pcpu_dirty_mask; vcpumask_t vcpu_dirty_mask; #ifdef CONFIG_TLB_TRACK_CNT #define TLB_TRACK_CNT_FORCE_MANY 256 /* XXX how many? */ unsigned long cnt; #endif }; struct tlb_track { /* see __gnttab_map_grant_ref() A domain can map granted-page up to MAPTRACK_MAX_ENTRIES pages. */ #define TLB_TRACK_LIMIT_ENTRIES \ (MAPTRACK_MAX_ENTRIES * (PAGE_SIZE / sizeof(struct tlb_track))) spinlock_t free_list_lock; struct list_head free_list; unsigned int limit; unsigned int num_entries; unsigned int num_free; struct list_head page_list; /* XXX hash table size */ spinlock_t hash_lock; unsigned int hash_size; unsigned int hash_shift; unsigned int hash_mask; struct list_head* hash; }; int tlb_track_create(struct domain* d); void tlb_track_destroy(struct domain* d); void tlb_track_free_entry(struct tlb_track* tlb_track, struct tlb_track_entry* entry); void __vcpu_tlb_track_insert_or_dirty(struct vcpu *vcpu, unsigned long vaddr, struct p2m_entry* entry); static inline void vcpu_tlb_track_insert_or_dirty(struct vcpu *vcpu, unsigned long vaddr, struct p2m_entry* entry) { /* optimization. non-tracking pte is most common. */ perfc_incr(tlb_track_iod); if (!pte_tlb_tracking(entry->used)) { perfc_incr(tlb_track_iod_not_tracked); return; } __vcpu_tlb_track_insert_or_dirty(vcpu, vaddr, entry); } /* return value * NULL if this entry is used * entry if this entry isn't used */ enum TLB_TRACK_RET { TLB_TRACK_NOT_TRACKED, TLB_TRACK_NOT_FOUND, TLB_TRACK_FOUND, TLB_TRACK_MANY, TLB_TRACK_AGAIN, }; typedef enum TLB_TRACK_RET TLB_TRACK_RET_T; TLB_TRACK_RET_T tlb_track_search_and_remove(struct tlb_track* tlb_track, volatile pte_t* ptep, pte_t old_pte, struct tlb_track_entry** entryp); void __tlb_track_entry_printf(const char* func, int line, ---------------------------------------.
- * |Reset| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 |VolUp|
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * |Power| F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 |VolDn|
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * | | | | | | | | | |Clmak|Qwrty| |
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * | | | | |Prev |Mute |Play |Next | | | | |
- * `-----------------------------------------------------------------------'
- */
- [_FUNC] = LAYOUT_planck_grid(
- RESET, KC_F1, KC_F2, KC_F3,
- KC_F4, KC_F5, KC_F6, KC_F7,
- KC_F8, KC_F9, KC_F10, KC_VOLU,
-
- KC_POWER, KC_F11, KC_F12, KC_F13,
- KC_F14, KC_F15, KC_F16, KC_F17,
- KC_F18, KC_F19, KC_F20, KC_VOLD,
-
- _______, XXXXXXX, KC_HOME, SC(KC_TAB),
- C(KC_TAB), KC_END, XXXXXXX, XXXXXXX,
- XXXXXXX, COLEMAK, QWERTY, _______,
-
- _______, _______, _______, _______,
- KC_MPRV, KC_MUTE, KC_MPLY, KC_MNXT,
- _______, _______, _______, _______
- ),
-
- /* MOUSE
- * ,-----------------------------------------------------------------------.
- * | | |CtrL |CtrU |CtrR | B5 |CtrU | ScL |Up | ScR | | |
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * | | | Ac0 | Ac1 | Ac2 | B4 |CtrL |Left |Down |Right|CtrR | |
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * | | | |Home | End | B3 |CtrD | ScD | ScU |TabL |TabR | |
- * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
- * | | | | | | B2 | B1 | | | | | |
- * `-----------------------------------------------------------------------'
- */
- [_MOUSE] = LAYOUT_planck_grid(
- _______, XXXXXXX, C(KC_LEFT), C(KC_UP),
- C(KC_RIGHT), KC_BTN5, C(KC_UP), KC_WH_R,
- KC_MS_U, KC_WH_L, XXXXXXX, XXXXXXX,
-
- _______, XXXXXXX, KC_ACL0, KC_ACL1,
- KC_ACL2, KC_BTN4, C(KC_LEFT), KC_MS_L,
- KC_MS_D, KC_MS_R, C(KC_RIGHT), XXXXXXX,
-
- _______, XXXXXXX, XXXXXXX, KC_HOME,
- KC_END, KC_BTN3, C(KC_DOWN), KC_WH_U,
- KC_WH_D, SC(KC_TAB), C(KC_TAB), _______,
-
- _______, _______, _______, _______,
- _______, KC_BTN2, KC_BTN1, _______,
- _______, _______, _______, _______
- )
};
-#ifdef AUDIO_ENABLE
-float colemak_song[][2] = SONG(COLEMAK_SOUND);
-float qwerty_song[][2] = SONG(QWERTY_SOUND);
-#endif
-
-void set_colemak(void) {
-#ifdef AUDIO_ENABLE
- stop_all_notes();
- PLAY_SONG(colemak_song);
-#endif
- set_single_persistent_default_layer(_COLEMAK);
+bool send_string_if_keydown(keyrecord_t *record, const char *s) {
+ if (record->event.pressed) {
+ SEND_STRING(s);
+ }
+ return true;
}
-void set_qwerty(void) {
-#ifdef AUDIO_ENABLE
- stop_all_notes();
- PLAY_SONG(qwerty_song);
-#endif
- set_single_persistent_default_layer(_QWERTY);
-}
+int cmd_keys_down = 0;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
- case COLEMAK:
- if (record->event.pressed) {
- set_colemak();
- }
- return false;
- case QWERTY:
+ // Override the defualt auto shifted symbols to use SEND_STRING See
+ // https://github.com/qmk/qmk_firmware/issues/4072
+ case ampr:
+ return send_string_if_keydown(record, "&");
+ case astr:
+ return send_string_if_keydown(record, "*");
+ case at:
+ return send_string_if_keydown(record, "@");
+ case bsls:
+ return send_string_if_keydown(record, "\\");
+ case circ:
+ return send_string_if_keydown(record, "^");
+ case dlr:
+ return send_string_if_keydown(record, "$");
+ case eql:
+ return send_string_if_keydown(record, "=");
+ case exlm:
+ return send_string_if_keydown(record, "!");
+ case grv:
+ return send_string_if_keydown(record, "`");
+ case hash:
+ return send_string_if_keydown(record, "#");
+ case lbrc:
+ return send_string_if_keydown(record, "[");
+ case lcbr:
+ return send_string_if_keydown(record, "{");
+ case lprn:
+ return send_string_if_keydown(record, "(");
+ case perc:
+ return send_string_if_keydown(record, "%");
+ case pipe:
+ return send_string_if_keydown(record, "|");
+ case plus:
+ return send_string_if_keydown(record, "+");
+ case rbrc:
+ return send_string_if_keydown(record, "]");
+ case rcbr:
+ return send_string_if_keydown(record, "}");
+ case rprn:
+ return send_string_if_keydown(record, ")");
+ case tild:
+ return send_string_if_keydown(record, "~");
+
+ // cmd + cmd -> cmd + ctl
+ case cmd:
if (record->event.pressed) {
- set_qwerty();
- }
- return false;
- case SYMB:
- if (record->event.pressed) {
- layer_off(_MOUSE);
- layer_on(_SYMB);
- } else {
- layer_off(_SYMB);
- }
- return false;
- case MOVE:
- if (record->event.pressed) {
- layer_off(_MOUSE);
- layer_on(_MOVE);
+ if (cmd_keys_down == 0) {
+ register_code(KC_LCMD);
+ } else {
+ register_code(KC_LCTL);
+ }
+ cmd_keys_down++;
} else {
- layer_off(_MOVE);
+ if (cmd_keys_down == 1) {
+ unregister_code(KC_LCMD);
+ } else {
+ unregister_code(KC_LCTL);
+ }
+ cmd_keys_down--;
}
- return false;
- case FUNC:
- if (record->event.pressed) {
- layer_off(_MOUSE);
- layer_on(_FUNC);
- } else {
- layer_off(_FUNC);
- }
- return false;
- case MOUSE:
- if (record->event.pressed) {
- layer_on(_MOUSE);
- }
- return false;
-
- // Override the defualt auto shifted symbols to use SEND_STRING
- // See https://github.com/qmk/qmk_firmware/issues/4072
- case KC_EXLM:
- if (record->event.pressed) { SEND_STRING("!"); }
- return false;
- case KC_AT:
- if (record->event.pressed) { SEND_STRING("@"); }
- return false;
- case KC_HASH:
- if (record->event.pressed) { SEND_STRING("#"); }
- return false;
- case KC_DLR:
- if (record->event.pressed) { SEND_STRING("$"); }
- return false;
- case KC_PERC:
- if (record->event.pressed) { SEND_STRING("%"); }
- return false;
- case KC_CIRC:
- if (record->event.pressed) { SEND_STRING("^"); }
- return false;
- case KC_AMPR:
- if (record->event.pressed) { SEND_STRING("&"); }
- return false;
- case KC_ASTR:
- if (record->event.pressed) { SEND_STRING("*"); }
- return false;
- case KC_LPRN:
- if (record->event.pressed) { SEND_STRING("("); }
- return false;
- case KC_RPRN:
- if (record->event.pressed) { SEND_STRING(")"); }
- return false;
- case KC_TILD:
- if (record->event.pressed) { SEND_STRING("~"); }
- return false;
- case KC_GRV:
- if (record->event.pressed) { SEND_STRING("`"); }
- return false;
- case KC_PLUS:
- if (record->event.pressed) { SEND_STRING("+"); }
- return false;
- case KC_EQL:
- if (record->event.pressed) { SEND_STRING("="); }
- return false;
- case KC_PIPE:
- if (record->event.pressed) { SEND_STRING("|"); }
- return false;
- case KC_BSLS:
- if (record->event.pressed) { SEND_STRING("\\"); }
- return false;
- case KC_LBRC:
- if (record->event.pressed) { SEND_STRING("["); }
- return false;
- case KC_RBRC:
- if (record->event.pressed) { SEND_STRING("]"); }
- return false;
- case KC_LCBR:
- if (record->event.pressed) { SEND_STRING("{"); }
- return false;
- case KC_RCBR:
- if (record->event.pressed) { SEND_STRING("}"); }
- return false;
+ return true;
}
return true;
}
diff --git a/keyboards/planck/keymaps/callum/readme.md b/keyboards/planck/keymaps/callum/readme.md
index 99b6dfbef..190c2b23a 100644
--- a/keyboards/planck/keymaps/callum/readme.md
+++ b/keyboards/planck/keymaps/callum/readme.md
@@ -1,11 +1,11 @@
-# callum’s planck layout
+# callum's planck layout
This is a layout for the grid planck, built with a few ideals in mind:
- Consistent and minimal response times should be maintained. Keys that react
differently depending on whether they are tapped or held, keys that react
- differently if they are double tapped, etc. should be avoided -- they
- inevitably send their keycode later than a normal key -- interrupting the
+ differently if they are double tapped, etc. should be avoided – they
+ inevitably send their keycode later than a normal key – interrupting the
immediate feedback from the screen. Therefore we restrict ourselves to
chording as our only means of getting more than one symbol out of a single
physical key.
@@ -17,7 +17,22 @@ This is a layout for the grid planck, built with a few ideals in mind:
- There should be two of every modifier (one on each side), otherwise certain
long key combinations become hard to make.
-A layout graphic can be found [here][keyboard-layout-editor] (excludes window
-management keys).
+- It should be possible to do things you might want to do while using the mouse
+ with only the left hand (e.g. change tabs, navigate back or forwards in
+ browser history).
-[keyboard-layout-editor]: http://www.keyboard-layout-editor.com/#/gists/ade5ec1f814bf83046489a4b632575ff
+- Symbols should be arranged so that the most frequently used are easiest to
+ reach. This includes numbers, and lower numbers are more commonly used than
+ higher ones. (number arrangement borrowed from [dustypomeleau's minidox
+ layout][].
+
+Layout rendered with [keyboard-layout-editor.com][]:
+
+![](https://callum-oakley.github.io/images/keymap.png)
+
+The only behaviour not captured in this graphic is: pressing both cmd keys will
+send cmd+ctrl. See [keymap.c][] for details.
+
+[dustypomeleau's minidox layout]: https://github.com/qmk/qmk_firmware/tree/master/keyboards/minidox/keymaps/dustypomerleau
+[keyboard-layout-editor.com]: http://www.keyboard-layout-editor.com
+[keymap.c]: keymap.c
diff --git a/keyboards/planck/keymaps/callum/rules.mk b/keyboards/planck/keymaps/callum/rules.mk
index 182322ae2..db87d5ece 100644
--- a/keyboards/planck/keymaps/callum/rules.mk
+++ b/keyboards/planck/keymaps/callum/rules.mk
@@ -3,7 +3,7 @@
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration