* More keymap fixes. F-row on bottom layer wasn't fully setup, also switched raise/lower keys to use tap-toggle.
* Added PrScr, put Tab back on top layer.
* Fixed build breakage with default keymap (unneeded rgblight.h include)
* Add yuuki keymap
Documentation is still a TODO and the keymap may not be final
* GRV on colon
* add KC_GRV to FN ESC
* more RGB modes
* Update README.md
Add image of layout and fix typo
* switch from jpg to png
For some reason the JPG had red outlines around the keys.
* remove whitespace
* add instruction to reset keyboard before flashing
* gh60 stytle layout
* moved the GH60 style layout to new folder
* add HOME and END
* Add heading
* moved ayanami to other branch
* restructure converters
each converter is its own keyboard and different hardware variants are different subprojects.
remove (seemingly) old method of loading layouts from main Makefile
* call led_set_kb() from overridden led_set()
* put converter back into one folder
* revert some structure changes to bring in line with #1784.
Also attempt to get the BLE thing more properly integrated.
Also also fix led_set() to call led_set_kb().
* Add woodpad
* Cleanup
* Remove misc layouts for woodpad
* Move woodpad to handwired
* Updated RGB Underglow info
* Cleanup macros
* Tweaked RGB lighting stuff
* Start to merge orthodox/ergodox keymaps (persistant layers)
* Add woodpad
* Add forced NKRO
* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow
* Updated macros and added workman keymaps
* Fixed RGB lighting for Workman layout
* Add leader keys
* Remove force NKRO
* Add Viterbi one handed layout and minor tweaks to others
* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts
* Made "make" keystroke universal
* Clean up and updates of drashna keymaps
* Add workman layer to planck
* Update to keymaps
* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox
* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function
* Remove unnecessary planck layout
* Fixed Workman song
* update make command and added lit reset
* Fixed formatting to fall in line with official standards
* Minor tweaks
* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red
* Tweak reset code
* Cleanup
* Remove misc layouts for woodpad
* Move woodpad to handwired
* Updated RGB Underglow info
* Cleanup macros
* Tweaked RGB lighting stuff
* Start to merge orthodox/ergodox keymaps (persistant layers)
* Add forced NKRO
* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow
* Updated macros and added workman keymaps
* Fixed RGB lighting for Workman layout
* Add leader keys
* Remove force NKRO
* Add Viterbi one handed layout and minor tweaks to others
* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts
* Made "make" keystroke universal
* Clean up and updates of drashna keymaps
* Add workman layer to planck
* Update to keymaps
* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox
* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function
* Remove unnecessary planck layout
* Fixed Workman song
* update make command and added lit reset
* Fixed formatting to fall in line with official standards
* Minor tweaks
* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red
* Tweak reset code
* Fix rebasing issues
* remove head files
* Fix "macro" issue
* Rename ez keymaps for userspace
* Revert "Rename ez keymaps for userspace"
This reverts commit c25425911852e41711a5f0273b5741adb16e5bd4.
* Renamed Ergodox EZ layouts so that all of my personal layouts are on the same name, in prep for using userspaces
* Fix ergodox code
* Remove "drashna-ez" keymap as it's no longer needed
* Migrate majority of code to Userspace
* Add woodpad
* Cleanup
* Remove misc layouts for woodpad
* Move woodpad to handwired
* Updated RGB Underglow info
* Cleanup macros
* Tweaked RGB lighting stuff
* Start to merge orthodox/ergodox keymaps (persistant layers)
* Add woodpad
* Add forced NKRO
* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow
* Updated macros and added workman keymaps
* Fixed RGB lighting for Workman layout
* Add leader keys
* Remove force NKRO
* Add Viterbi one handed layout and minor tweaks to others
* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts
* Made "make" keystroke universal
* Clean up and updates of drashna keymaps
* Add workman layer to planck
* Update to keymaps
* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox
* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function
* Remove unnecessary planck layout
* Fixed Workman song
* update make command and added lit reset
* Fixed formatting to fall in line with official standards
* Minor tweaks
* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red
* Tweak reset code
* Cleanup
* Remove misc layouts for woodpad
* Move woodpad to handwired
* Updated RGB Underglow info
* Cleanup macros
* Tweaked RGB lighting stuff
* Start to merge orthodox/ergodox keymaps (persistant layers)
* Add forced NKRO
* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow
* Updated macros and added workman keymaps
* Fixed RGB lighting for Workman layout
* Add leader keys
* Remove force NKRO
* Add Viterbi one handed layout and minor tweaks to others
* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts
* Made "make" keystroke universal
* Clean up and updates of drashna keymaps
* Add workman layer to planck
* Update to keymaps
* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox
* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function
* Remove unnecessary planck layout
* Fixed Workman song
* update make command and added lit reset
* Fixed formatting to fall in line with official standards
* Minor tweaks
* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red
* Tweak reset code
* Fix rebasing issues
* remove head files
* Fix "macro" issue
* Rename ez keymaps for userspace
* Revert "Rename ez keymaps for userspace"
This reverts commit c25425911852e41711a5f0273b5741adb16e5bd4.
* Renamed Ergodox EZ layouts so that all of my personal layouts are on the same name, in prep for using userspaces
* Fix ergodox code
* Remove "drashna-ez" keymap as it's no longer needed
avoid the following error when `UNICODEMAP_ENABLE = yes`:
```
quantum/process_keycode/process_unicodemap.c:52:21: error: implicit declaration of function 'pgm_read_dword'
```
* Set up tap dance for layers on the lower button.
* Refactored code to share in the users directory between my two keyboard layouts.
* Small keyboard layout change.
* Updated documentation on oneshot usage in macros/tap dance.
* importing 42 key dvorak layout
* added comment for build instructions
* adding atreus dvorak 42 key layout
* added readme
* add readme
* build instructions
* additional MEH shortcuts
* added shifted symbols on symbols layer
* working extra symbols on COMBINED layer
* bring atreus layout inline with the ergodox one
* add necessary macros
* working ls macro
* added more shell macros
* added screen rename / screen number macros
* add ctrl-a key in shell-nav to use screen more easily
* added shell screen layer
* assign screen switching macros to screen layer
* define all screen switching macros
* more screen-related shortcuts added on shell screen layer
* change shell nav bottom right row to match base layer (backspace / delete)
* remove some mappings on SHELL_NAV layer as they are now in the screen layer
* added more screen macros
* Fix RGBLIGHT startup color
While it's awesome to see the layer indicating code in here (no really!), and the general rule is to not alter the default keymap/code....
The problem with the layer_state_set_kb call handling this, is that the code doesn't seem to be called at startup. So the default layer color won't ever get set on startup. It needs to be called in the init function to be properly set.
I've played with this extensively, and if you check my keymaps, that is precisely why I have the setrgb/sethsv in the init function.
* Removed typo (pipe)
* mitosis/datagrok: reduce features from rules.mk
* mitosis/datagrok: make both layer keys neighbor shift
* mitosis/datagrok: (no-op) tweak some comments
* mitosis/datagrok: set baudrate to 250k
This requires a corresponding change to the mitosis wireless firmware:
https://github.com/reversebias/mitosis/pull/10
* mitosis/datagrok: move design description from code comment to a readme
* mitosis/datagrok: new layout, new shifted keys, efficient LED code
This is experimental, but compiles and seems to work correctly.
* mitosis/datagrok: whoops, move readme.md
* mitosis/datagrok: a minor layout improvement simplifies custom-shifted code
instead of [, .] [? !], using [, ?] [. !] greatly simplifies the code
needed to perform the shifted-key switching. (And keeps , and . on the
same keys that they are under qwerty.)
also: layout improvements for symbols
* mitosis/datagrok: make my code conform to QMK style guidelines
* mitosis/datagrok: TODO note for layout table in README
* mitosis/datagrok: remove led_set_user until i figure out other changes
need to see if the corresponding changes needed in the keyboard-level code
is okay.
* mitosis/datagrok: simpler layer indicator
* mitosis/datagrok: undo change to keyboard baud; make it in my layout dir.
* mitosis/datagrok: apply same punctuation hack to qwerty layer
* mitosis/datagrok: enable qwerty layer toggle
* mitosis/datagrok: update readme
* Add satan keymap: HHKB-alike based on dbroqua's, with mouse functionality and without LED functionality
* move mouse layer to DOUBLE_HOLD, add UTIL layer for TRIPLE_HOLD
- UTIL layer
- currently has "RESET" key and nothing else.
- functionality otherwise covered by bootmagic should go here
- small bugfix: dispatch of [QTY]_HOLD should be based on range tap count
falls in, not exact count.
* Added support for Knops Mini (3x2 macropad) keyboard.
* Added better documentation, according to the QMK standards.
* Fixed typo.
* Changed names of files to comply with QMK standards.
* Ignored makefile in keymap.
* Removed makefiles and added my credentials in the copyrights.
* adds .qmk file type as a target
* adds info.json with vendor and product
* add files for qmk info script
* add layout file for planck
* ignore .qmk files
* more settings
* update rules for avr and chibios
* update .qmk generation for info.json and inheritence
* Typo: Github => GitHub
* Typo: windows => Windows, docker => Docker, and some punctuations
* "QMK Introduction" links to the right file
* "Unix" rather than "UNIX", which is a trademark
* Directory name is "keyboards", not "keyboard"
* "handwired" is a subdirectory of "keyboards"
* Punctuation and minor fixes
* macOS rather than Mac
* Punctuation and other minor fixes
* Vagrant Guide links to an existing file
* Jun Wako referenced with his name rather than his nickname
* Saxon genitive 's outside the link
* Add woodpad
* Cleanup
* Remove misc layouts for woodpad
* Move woodpad to handwired
* Updated RGB Underglow info
* Cleanup macros
* Fix odd merge issue
* Tweaked RGB lighting stuff
* Start to merge orthodox/ergodox keymaps (persistant layers)
* Add forced NKRO
* Added Colemak and Dvorak layers to default orthodox keymap
* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow
* Updated macros and added workman keymaps
* Fixed RGB lighting for Workman layout
* Add leader keys
* Remove force NKRO
* Add Viterbi one handed layout and minor tweaks to others
* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts
* Made "make" keystroke universal
* Clean up and updates of drashna keymaps
* Add workman layer to planck
* Update to keymaps
* Fix accidental commit because I don't know how to git
* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox
* missing underscore in init function declaration
* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function
* Remove unnecessary planck layout
* Created Kona Classic config
* Fixed KonaClassic config
* Updated README
* Updated Readme to conform to format standards
* Added ANSI and ISO layout options
* Fixed images in Readme
* Added labels to images
* Added absolute links to images in Readme
* Image link updates again
* Fixed bottom row keys in some layouts
* Fixed Grave and Tilde
* Fixed Underglow in Kona Classic configs
* Renamed KonaClassic to kona_classic
* add RETRO_TAP: tap anyway, even after TAP_TERM, if no interruption
* consistent variable name
* add option doc
* change name for consistency
* make RETRO_TAPPING default to off
* 🔧 add editorconfig
This makes supported editors automatically change their settings to match desired code styles
* 🔧 add extension recommendation for VSCode
This will cause VS Code to prompt the user to install the EditorConfig extension when they open the project.
If this is felt to be too opinionated, I can revert it.
* Fix pointer device options
when the feature was added, the appropriate option definition wasn't created. This needs to be added to function properly.
* Update common_features.mk
* missing underscore in init function declaration
I'm almost 100% sure "else if (state->count = 2) {" was a typo (it should have two ='s for a logical operator), and I'm *pretty* sure "if (state->interrupted || state->!pressed) return SINGLE_TAP;" has a typo. At least, it returns an error on my machine saying something about an unexpected '!'.
I changed it to a slightly longer form (i.e., "state->pressed==0"), and that worked fine.
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware
* Fix terminus_mini & nyquist/DivergeJM readme files
Previously an outdated copy of the default readme. Updated to match the Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)
* Update makefiles to rules.mk
Renamed both Makefiles to rules.mk, removed references to makefiles
* Updated rules.mk
Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.
Also disabled Tap_Dance in both rules.mk files
* Moved terminus_mini to handwired
Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.
* New Frosty Flake layout for QFR TKL
Added a TKL layout for the Frosty Flake with a navigation cluster on LOWER under the left hand and a similarly functioning MOUSE layer that includes mouse navigation functionality.
* README fix & keymap update for 3 keyboards
Fixed the markdown for the handwired/terminus_mini:default, Nyqyist:DivergeJM & frosty_flake:QFR_JM.
Added TAPPING_TERM = 150 to config.h for all keyboards
Switched LT(LOWER) and LAlt on the mod row for ortholinear boards.
* Update readme for QFR_JM to include make instructions
* Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware"
This reverts commit a45f264ada09acc14fb85390407bc7ff5bb021e3, reversing
changes made to 62349c33410671a33d4041d50cf27de1d6bdd9cf.
* Revert "Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware""
This reverts commit eae54fb3be2c60dffd704261f84bab98c9e06f93.
* Added QWERTY support to the QFR_JM
Implemented variable default base layer from the Planck default keymap.
* Update README to reflect QWERTY support
Previously, this code was implemented in keymap.c, but I'm unaware of
someone with a different implementation of this particular hack. [If
someone has it, we can add another #ifdef in the future.]
* Added personal minivan keymap
more consistent layer setup
documentation!
slide some things around
more doc jiggling
* Small layout and documentation tweaks
Small documentation updates
dropped Makefile that for some reason was still in my branch
* found and removed extra makefile
* added bfake support as a subproject
also moved existing bmini stuff to a subproject
fixed columns
minor keymap update
making this a subproject
remove old stuff
got subproject stuff figured out
* travis was upset because a board didn't have a default keymap
This commit adds a new keycode `RGB_SMOD` which is the same as `RGB_MOD` (cycle through all modes),
but when it is used in combination with shift it will reverse the direction.
* - Fixed DK60 version in config.h
* - Updated dk60 readme with new QMK rules
* - Fixed wording in readme
* Added dbroqua layout for DZ60
I've also updated dz60.h to add "true HHKD" keymap definition (6U
spacebar).
With the default HHKB definition r_alt was not mapped and when I pressed
r_menu it was r_alt.
Regards
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware
* Fix terminus_mini & nyquist/DivergeJM readme files
Previously an outdated copy of the default readme. Updated to match the Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)
* Update makefiles to rules.mk
Renamed both Makefiles to rules.mk, removed references to makefiles
* Updated rules.mk
Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.
Also disabled Tap_Dance in both rules.mk files
* Moved terminus_mini to handwired
Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.
* New Frosty Flake layout for QFR TKL
Added a TKL layout for the Frosty Flake with a navigation cluster on LOWER under the left hand and a similarly functioning MOUSE layer that includes mouse navigation functionality.
* Add existing file
* Add new keyboard layout - initial commit
* Revised readme.md
* Clarified readme.md, reorganized keymap.c, and added license text.
* Fixing last incomplete commit
* Just a little code cleanup to make things more readable.
* Add carvac_dv keymap for mitosis
* Add mouse keys
* move backspace, etc, and fix tab
* remove commented-out functions in keymap
* Fix scroll buttons and add left/right scrolling
* Make num momentary, add comments, and clean up
* fix mouse scroll acceleration
* Add tab, remove bksp, move print screen
Having tab next to control and alt makes for much easier
alt-tabbing and ctrl-tabbing.
That displaced print screen, but I had never used the non-layer
backspace on the right hand, so I moved printscreen over there.
* - Fancy default PID and option for corresponding VID.
- Information about official VID/PID.
- Correct manufacturer name.
- NKRO enabled by default.
* Resolved build error with `#ifndef FORCE_NKRO`.
* Clone Nyquist code to Iris and rename
* Set keymap and pins
* Work in progress Iris default keymap
* Add Iris rev2
* Update Iris files to new build system
* Add lewisridden keymap
* Added section to example, detailing how to accomplish the
'quad-function' tap dance.
* Refactored TD documentation to clearly separate different complex
examples
Change-Id: Ifc1495d1142849c771418fdabc458c04c48311e6
* Address #1689 by using a formula to define the breathing curve and exposing defines to control the shape of the curve.
* Tweak the behavior of breathing for clueboard
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware
* Fix terminus_mini & nyquist/DivergeJM readme files
Previously an outdated copy of the default readme. Updated to match the Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)
* Update makefiles to rules.mk
Renamed both Makefiles to rules.mk, removed references to makefiles
* Updated rules.mk
Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.
Also disabled Tap_Dance in both rules.mk files
* Moved terminus_mini to handwired
Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.
* redo make args to use colons, better folder structuring system [skip ci]
* don't put spaces after statements - hard lessons in makefile development
* fix-up some other rules.mk
* give travis a chance
* reset KEYMAPS variable
* start converting keyboards to new system
* try making all with travis
* redo make args to use colons, better folder structuring system [skip ci]
* don't put spaces after statements - hard lessons in makefile development
* fix-up some other rules.mk
* give travis a chance
* reset KEYMAPS variable
* start converting keyboards to new system
* try making all with travis
* start to update readmes and keyboards
* look in keyboard directories for board.mk
* update visualizer rules
* fix up some other keyboards/keymaps
* fix arm board ld includes
* fix board rules
* fix up remaining keyboards
* reset layout variable
* reset keyboard_layouts
* fix remainging keymaps/boards
* update readmes, docs
* add note to makefile error
* update readmes
* remove planck keymap warnings
* update references and docs
* test out tarvis build stages
* don't use stages for now
* don't use stages for now
* add ymd96 base
currently not working correctly.
* Update
honestly not really sure what I've been doing but I'm just more or less brute forcing this until I can get the pcb schematic or something
* honestly just trying stuff out
* Update keymaps
Getting closer hopefully
* ymd96 works!
at least for me
* Update readme
* Update readme
* Update readme
* Adds support for multiple layouts. Adds custom keymap for "offset"
layout.
* Adds a tool to help detach the keyboard from the Linux HID driver before programming.
* Adds a tool to help detach the keyboard from the Linux HID driver before programming.
- a keyboard already in bootloader mode will now be detected
- if setting the keyboard to bootloader mode doesn't work, a hint will be printed on how to do so
- instead of failing instantly when no keyboard is found, the script will now wait up to 60 seconds (it retries every 5 seconds, up to 12 times)
At one time, "ez" and "infinity" may have been subprojects of a
unified "ergodox" project, but this is not currently the case. Running
`make ergodox-ez-default-teensy` (or similar), as the documentation
currently implies, does not work.
neue Datei: keyboards/lets_split/keymaps/DE_simple/config.h
neue Datei: keyboards/lets_split/keymaps/DE_simple/keymap.c
neue Datei: keyboards/lets_split/keymaps/DE_simple/rules.mk
* slight modifier changes; added plover and reusing jack's default planck keymap as the basis
* space is not shift when held anymore
* added fabian layout (based on jack's default)
* changed fabian layout (based on jack's default)
* changed fabian layout (based on jack's default)
* Fix mbsurfer let's split layout RGB indicators when both lower and raise are pressed
* Update mbsurfer let's split keymap with new RGB key codes for modes
* Clean up mbsurfer keymap matrix layout
Overall changes
===============
* Updated to work with QMK master.
* The `$` and `^` symbols on the number row were swapped on both the base and
the ADORE layers.
* The bracket tap-dance keys can now be used to input Japanese brackets, `「`
and `」` with a third tap.
* The second column of the top row on the right side will act as a "Social"
application selector on the `AppSel` layer.
* The third key on the same column will select a password manager.
* The `GUI` key will now launch `rofi` when triple-tapped.
Miscellaneous
=============
* The `👶` symbol can be entered with UCIS.
* The `👪` symbol can be entered with UCIS.
Tools
=====
* `tools/hid-commands` can now find the `Mstdn`, not just `Slack`, as the
"Slack"/chat app.
* `tools/hid-commands` can now find the Plex web app as a music/media player.
* `tools/hid-commands` now understands the "Social" application selector. It
raises the `Mstdn` and `Tweetdeck` windows, but keeps focus on the previous
window.
* `tools/hid-commands` now understands the "Social2" application selector, which
raises `Signal` and `Viber`, but keeps focus on the previous window.
* `tools/hid-commands` is now able to select a password manager (KeePass*).
* `tools/hid-commands` can now run `rofi` when receiving an `appsel_helper`
command (triggered by a triple-tapped `GUI` key).
Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
* initial clueboard_60 support
* LED lighting support
* fix the clueboard->clueboard_66 rename
* Add layout support to clueboard_60
* Fix the 60_iso layout so it's actually iso
* add a default keymap for AEK layout
* fix clueboard_17
* Fixup the ISO layouts
* Fix the `wait_ms()/wait_us()` definitions for chibios
* Fix up the wait_ms/wait_us hack. Reduce stack size.
* Add a missing #include "wait.h"
* commit files that should have already been comitted
* Support for KBP V60 Type R 60% keyboard
Support does not include in switch or underglow lighting for Polestar Edition.
* rename v60type_r to v60_type_r
* Remove old v60type_r
* Modify readme.md to adhere with QMK readme formatting.
tearing it down so that it can be rebuilt
fiddling with audio
big default config overhaul
apparently startup sounds work without the override now
readme!
readme fixes
readme tweaking
* Add yuuki keymap
Documentation is still a TODO and the keymap may not be final
* GRV on colon
* add KC_GRV to FN ESC
* hhkb ish
* hhkbish 2
* HHKBish and documentation
* Fix Markdown warnings
* typo
* phreed keymap added
This keymap moves many pinky keys to the center
* set to do what I want but LT() does not return to previous layer
* get overlays working
* get overlays working
* fix the readme
* fix the readme
* swapped the shift
* swapped the shift
* propagate mods
* clear special char on readme
* Implement sticky modifiers
* Change underglow based on sticky mod status
* Set RGB lights based on which mods are stickied
* Add controls for dimming RGB LEDs
* Only update RGB lights if modifiers have changed
* Use all LEDs to show modifier state
* Create default keymap for Viterbi
* Duplicate default layout as basis of my own
* Basic Colemak layer, just to practice flashing
* Add reset button so that we don't have to short out the reset button on the board to flash it.
* Symbols layer
* Navigation layer, and remove unused keys. Now usable, nice.
* Correct backspace for UK QWERTY mapping
* Small clarification in XD75RE readme instructions
* Use UK pipe so that I can type a pipe on a UK keyboard
* adding new layout for the planck that helps when coming from the pok3r
* Fixing the function layer
* Update readme.md
* Update keymap.c
Making some small adjustments
* Update keymap.c
switching GUI and Esc
* Update keymap.c
* changed 'infinity' to 'ergodox_infinity' and specified to be in the top-level directory as per recent changes to directory structure of QMK_firmware git repo
* accidently removed '-' in last line of readme
* add new RGB keycodes and clean up lets split keymap
* extraneous cases
* More cleanup and added macro
* one more macro
* cleaned up my planck keymap and added macros
* Transitioned planck keymap to new formatting / audio modes based on new default
* Remove extraneous newline in song list, add keycodes missed in previous commit
* error in graphical representation of keycodes
* Merge with upstream
* Finish merge
* Add new keymap
* Change use of KEYMAP macro
* Add Readme.md
* Fix link
* Clean up comments
* Raise on leading edge of keypress
* Add HOME/END keys as upper/lower on arrow-up/down
* Reduce .hex file size by turning off unneeded options
* Put digit keypad onto left hand upon RAISE; this will sometimes be preferable to double-hits of right hand
* Latest super latest version merge
* cbbrowne keymap for XD75re
* starting notes on XD75re keymap plans
* First draft of bottom row of QWERTY
* Switch my special bottom line over to QCENT
* Dunno
* Filling in wanted keys, bit by bit...
* Add copyright, extra macro
* Clean up comments, remove some experimental code I didn't like
* TODO plans for xd75re
* clean up keyboard layout
* QCENT2 is my new experiment for the main keyboard...
* Add a few more main layer keys, and modify LOWER to shift things outwards to conform with main layer
* Clean up RAISE layer to conform with main layer, remove QCENT layer as QCENT2 is the new thing
* More xd75 changes, now that I actually have it in hand
* shift keymap around, as original attempt was a bit too aggressive in keeping to the edges
* more revs to XD75
* Dropping parts of the centre keypad in favor of Keys I Really Need
* Improve documentation to conform with how builds are done now
* Improve documentation to conform with how builds are done now
* Add cbbrowne rules file as alternative to having the rules in Makefile
* Makefile not needed anymore for individual keymap
@ -14,11 +14,11 @@ Otherwise, you can either download it directly ([zip](https://github.com/qmk/qmk
Before you are able to compile, you'll need to [install an environment](getting_started_build_tools.md) for AVR or/and ARM development. Once that is complete, you'll use the `make` command to build a keyboard and keymap with the following notation:
make planck-rev4-default
make planck/rev4:default
This would build the `rev4` revision of the `planck` with the `default` keymap. Not all keyboards have revisions (also called subprojects), in which case, it can be omitted:
This would build the `rev4` revision of the `planck` with the `default` keymap. Not all keyboards have revisions (also called subprojects or folders), in which case, it can be omitted:
We welcome all keyboard projects into QMK, but ask that you try to stick to a couple guidelines that help us keep things organised and consistent.
## Naming your directory/project
All names should be lowercase alphanumeric, and separated by an underscore (`_`), but not begin with one. Dashes (`-`) aren't allow by our build system, and will confuse it with keymaps/subprojects. Your directory and your `.h` and `.c` files should have exactly the same name. Subprojects/revision should follow the same format.
## `readme.md`
All projects need to have a `readme.md` file that explains what the keyboard is, who made it, where it is available, and links to move information (template coming).
## Image/Hardware files
In an effort to keep the repo size down, we're no longer accepting images of any format in the repo, with few exceptions. Hosting them elsewhere (imgur) and linking them in the readme.md is the preferred method.
Any sort of hardware file (plate, case, pcb) can't be stored in qmk_firmware, but we have the [qmk.fm repo](https://github.com/qmk/qmk.fm) where such files (as well as in-depth info) can be store, and viewed on [qmk.fm](http://qmk.fm). Downloadable files are stored in `/<keyboard>/` (name follows the same format as above) which are served at `http://qmk.fm/<keyboard>/`, and pages are generated from `/_pages/<keyboard>/` which are served at the same location (.md files are generated into .html files through Jekyll). Check out the `lets_split` directory for an example.
## Non-production/handwired projects
We're happy to accept any project that uses QMK, including prototypes and handwired ones, but we have a separate `/keyboards/handwired/` folder for them, so the main `/keyboards/` folder doesn't get overcrowded. If a prototype project becomes a production project at some point in the future, we'd be happy to move it to the main `/keyboards/` folder!
## Warnings as errors
When developing your keyboard, keep in mind that all warnings will be treated as errors - these small warnings can build-up and cause larger errors down the road (and keeping them is generally a bad practice).
## Licenses
If you're adapting your keyboard's setup from another project, but not using the same code, but sure to update the copyright header at the top of the files to show your name, it this format:
Copyright 2017 Your Name <your@email.com>
## Technical details
If you're looking for more information on making your keyboard work with QMK, [check out this guide](porting_your_keyboard_to_qmk.md)!
If you have an idea for a custom feature or extra hardware connection, we'd love to accept it into QMK!
Before you put a lot of work into building your new feature you should make sure you are implementing it in the best way. You can get a basic understanding of QMK by reading [Understaning QMK](understanding_qmk.html), which will take you on a tour of the QMK program flow. From here you should talk to us to get a sense of the best way to implement your idea. There are two main ways to do this:
* [Chat on Gitter](https://gitter.im/qmk/qmk_firmware)
* [Open an Issue](https://github.com/qmk/qmk_firmware/issues/new)
Once you have implemented your new feature you will generally submit a [pull request](https://github.com/qmk/qmk_firmware/pulls). Here are some things to keep in mind when creating one:
* **Disabled by default** - memory is a pretty limited on most chips QMK supports, and it's important that current keymaps aren't broken, so please allow your feature to be turned **on**, rather than being turned off. If you think it should be on by default, or reduces the size of the code, please talk with us about it.
* **Compile locally before submitting** - hopefully this one is obvious, but things need to compile! Our Travis system will catch any issues, but it's generally faster for you to compile a few keyboards locally instead of waiting for the results to come back.
* **Consider subprojects and different chip-bases** - there are several keyboards that have subprojects that allow for slightly different configurations, and even different chip-bases. Try to make a feature supported in ARM and AVR, or automatically disabled on platforms it doesn't work on.
* **Explain your feature** - Document it in `docs/`, either as a new file or as part of an existing file. If you don't document it other people won't be able to benefit from your hard work.
* **Don't refactor code** - to maintain a clear vision of how things are laid out in QMK, we try to plan out refactors in-depth, and have a collaborator make the changes. If you have an idea for refactoring, or suggestions, [open an issue](https://github.com/qmk/qmk_firmware/issues), we'd love to talk about how QMK can be improved.
This is a c header file that is one of the first things included, and will persist over the whole project (if included). Lots of variables can be set here and accessed elsewhere (namely keymaps). This file can exist at a couple different levels:
QMK is nearly infinitely configurable. Wherever possible we err on the side of allowing users to customize their keyboard, even at the expense of code size. That level of flexibility makes for a daunting configuration experience, however.
There are two main types of configuration files in QMK- `config.h` and `rules.mk`. These files exist at various levels in QMK and all files of the same type are combined to build the final configuration. The levels, from lowest priority to highest priority, are:
* QMK Default
* Keyboard
* Folders (Up to 5 levels deep)
* Keymap
## QMK Default
Every available setting in QMK has a default. If that setting is not set at the Keyboard, Folder, or Keymap level this is the setting that will be used.
## Keyboard
```c
#ifndef CONFIG_H
#define CONFIG_H
This level contains config options that should apply to the whole keyboard. Some settings won't change in revisions, or most keymaps. Other settings are merely defaults for this keyboard and can be overridden by folders and/or keymaps.
#include "config_common.h"
## Folders
// config options
#ifdef SUBPROJECT_<subproject>
#include "<subproject>/config.h"
#endif
#endif
```
This file contains config options that should apply to the whole keyboard, and won't change in subprojects, or most keymaps. The suproject block here only applies to keyboards with subprojects.
## Subproject
```c
#ifndef<subproject>_CONFIG_H
#define<subproject>_CONFIG_H
#include "../config.h"
// config options
#endif
```
For keyboards that have subprojects, this file contains config options that should apply to only that subproject, and won't change in most keymaps.
Some keyboards have folders and sub-folders to allow for different hardware configurations. Most keyboards only go 1 folder deep, but QMK supports structures up to 5 folders deep. Each folder can have its own `config.h` and `rules.mk` files that are incorporated into the final configuration.
## Keymap
```c
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
This level contains all of the options for that particular keymap. If you wish to override a previous declaration, you can use `#undef <variable>` to undefine it, where you can then redefine it without an error.
#include "../../config.h"
# The `config.h` file
// config options
This is a C header file that is one of the first things included, and will persist over the whole project (if included). Lots of variables can be set here and accessed elsewhere.
#endif
```
## `config.h` Options
This file contains all of the options for that particular keymap. If you wish to override a previous declaration, you can use `#undef <variable>` to undefine it, where you can then redefine it without an error.
### Hardware Options
* `#define VENDOR_ID 0x1234`
* defines your VID, and for most DIY projects, can be whatever you want
* `#define PRODUCT_ID 0x5678`
* defines your PID, and for most DIY projects, can be whatever you want
* `#define DEVICE_VER 0`
* defines the device version (often used for revisions)
* COL2ROW or ROW2COL - how your matrix is configured. COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows.
* `#define AUDIO_VOICES`
* turns on the alternate audio voices (to cycle through)
* `#define C6_AUDIO`
* enables audio on pin C6
* `#define B5_AUDIO`
* enables audio on pin B5 (duophony is enable if both are enabled)
* `#define BACKLIGHT_PIN B7`
* pin of the backlight - B5, B6, B7 use PWM, others use softPWM
* `#define BACKLIGHT_LEVELS 3`
* number of levels your backlight will have (not including off)
* `#define DEBOUNCING_DELAY 5`
* the delay when reading the value of the pin (5 is default)
* `#define LOCKING_SUPPORT_ENABLE`
* mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
* `#define LOCKING_RESYNC_ENABLE`
* tries to keep switch state consistent with keyboard LED state
* key combination that allows the use of magic commands (useful for debugging)
# Config Options
### Features That Can Be Disabled
```c
#define VENDOR_ID 0x1234 // defines your VID, and for most DIY projects, can be whatever you want
#define PRODUCT_ID 0x5678 // defines your PID, and for most DIY projects, can be whatever you want
#define DEVICE_VER 0 // defines the device version (often used for revisions)
If you define these options you will disable the associated feature, which can save on code size.
#define MANUFACTURER Me // generally who/whatever brand produced the board
#define PRODUCT Board // the name of the keyboard
#define DESCRIPTION a keyboard // a short description of what the keyboard is
* `#define NO_DEBUG`
* disable debuging
* `#define NO_PRINT`
* disable printing/debugging using hid_listen
* `#define NO_ACTION_LAYER`
* disable layers
* `#define NO_ACTION_TAPPING`
* disable tap dance and other tapping features
* `#define NO_ACTION_ONESHOT`
* disable one-shot modifiers
* `#define NO_ACTION_MACRO`
* disable all macro handling
* `#define NO_ACTION_FUNCTION`
* disable the action function (deprecated)
#define MATRIX_ROWS 5 // the number of rows in your keyboard's matrix
#define MATRIX_COLS 15 // the number of columns in your keyboard's matrix
### Features That Can Be Enabled
#define MATRIX_ROW_PINS { D0, D5, B5, B6 } // pins of the rows, from top to bottom
#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } // pins of the columns, from left to right
#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 } // pins unused by the keyboard for reference
#define MATRIX_HAS_GHOST // define is matrix has ghost (unlikely)
#define DIODE_DIRECTION COL2ROW // COL2ROW or ROW2COL - how your matrix is configured
// COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows
If you define these options you will enable the associated feature, which may increase your code size.
#define AUDIO_VOICES // turns on the alternate audio voices (to cycle through)
#define C6_AUDIO // enables audio on pin C6
#define B5_AUDIO // enables audio on pin B5 (duophony is enable if both are enabled)
* `#define FORCE_NKRO`
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of eeprom setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
* `#define PREVENT_STUCK_MODIFIERS`
* when switching layers, this will release all mods
#define BACKLIGHT_PIN B7 // pin of the backlight - B5, B6, B7 use PWM, others use softPWM
#define BACKLIGHT_LEVELS 3 // number of levels your backlight will have (not including off)
### Behaviors That Can Be Configured
#define DEBOUNCING_DELAY 5 // the delay when reading the value of the pin (5 is default)
* `#define TAPPING_TERM 200`
* how long before a tap becomes a hold
* `#define RETRO_TAPPING`
* tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
* `#define TAPPING_TOGGLE 2`
* how many taps before triggering the toggle
* `#define PERMISSIVE_HOLD`
* makes tap and hold keys work better for fast typers who don't want tapping term set above 500
* `#define LEADER_TIMEOUT 300`
* how long before the leader key times out
* `#define ONESHOT_TIMEOUT 300`
* how long before oneshot times out
* `#define ONESHOT_TAP_TOGGLE 2`
* how many taps before oneshot toggle is triggered
* `#define IGNORE_MOD_TAP_INTERRUPT`
* makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
#define LOCKING_SUPPORT_ENABLE // mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
#define LOCKING_RESYNC_ENABLE // tries to keep switch state consistent with keyboard LED state
### RGB Light Configuration
#define IS_COMMAND() ( \ // key combination that allows the use of magic commands (useful for debugging)
* units to step when in/decreasing value (brightness)
* `#define RGBW_BB_TWI`
* bit-bangs twi to EZ RGBW LEDs (only required for Ergodox EZ)
// the following options can save on file size at the expense of that feature
#define NO_DEBUG // disable debuging (saves on file size)
#define NO_PRINT // disable printing (saves of file size)
#define NO_ACTION_LAYER // no layers
#define NO_ACTION_TAPPING // no tapping for layers/mods
#define NO_ACTION_ONESHOT // no oneshot for layers/mods
#define NO_ACTION_MACRO // no macros
#define NO_ACTION_FUNCTION // no functions
### Mouse Key Options
#define FORCE_NKRO // NKRO by default requires to be turned on, this forces it to be on always
* `#define MOUSEKEY_INTERVAL 20`
* `#define MOUSEKEY_DELAY 0`
* `#define MOUSEKEY_TIME_TO_MAX 60`
* `#define MOUSEKEY_MAX_SPEED 7`
* `#define MOUSEKEY_WHEEL_DELAY 0`
#define PREVENT_STUCK_MODIFIERS // when switching layers, this will release all mods
# The `rules.mk` File
#define TAPPING_TERM 200 // how long before a tap becomes a hold
#define TAPPING_TOGGLE 2 // how many taps before triggering the toggle
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
#define PERMISSIVE_HOLD // makes tap and hold keys work better for fast typers who don't want tapping term set above 500
## `rules.mk` options
#define LEADER_TIMEOUT 300 // how long before the leader key times out
### Build Options
#define ONESHOT_TIMEOUT 300 // how long before oneshot times out
#define ONESHOT_TAP_TOGGLE 2 // how many taps before oneshot toggle is triggered
* `DEFAULT_FOLDER`
* Used to specify a default folder when a keyboard has more than one sub-folder.
* `SRC`
* Used to add files to the compilation/linking list.
* `LAYOUTS`
* A list of [layouts](feature_layouts.md) this keyboard supports.
#define IGNORE_MOD_TAP_INTERRUPT // makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
### AVR MCU Options
* `MCU = atmega32u4`
* `F_CPU = 16000000`
* `ARCH = AVR8`
* `F_USB = $(F_CPU)`
* `OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT`
* `OPT_DEFS += -DBOOTLOADER_SIZE=4096`
// ws2812 options
#define RGB_DI_PIN D7 // pin the DI on the ws2812 is hooked-up to
#define RGBLIGHT_ANIMATIONS // run RGB animations
#define RGBLED_NUM 15 // number of LEDs
#define RGBLIGHT_HUE_STEP 12 // units to step when in/decreasing hue
#define RGBLIGHT_SAT_STEP 25 // units to step when in/decresing saturation
#define RGBLIGHT_VAL_STEP 12 // units to step when in/decreasing value (brightness)
### Feature Options
#define RGBW_BB_TWI // bit-bangs twi to EZ RGBW LEDs (only required for Ergodox EZ)
Use these to enable or disable building certain features. The more you have enabled the bigger your firmware will be, and you run the risk of building a firmware too large for your MCU.
// mousekey options (self-describing)
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_DELAY 0
```
* `BOOTMAGIC_ENABLE`
* Virtual DIP switch configuration(+1000)
* `MOUSEKEY_ENABLE`
* Mouse keys(+4700)
* `EXTRAKEY_ENABLE`
* Audio control and System control(+450)
* `CONSOLE_ENABLE`
* Console for debug(+400)
* `COMMAND_ENABLE`
* Commands for debug and configuration
* `NKRO_ENABLE`
* USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
👍🎉 First off, thanks for taking the time to read this and contribute! 🎉👍
Third-party contributions help us grow and improve QMK. We want to make the pull request and contribution process useful and easy for both contributors and maintainers. To this end we've put together some guidelines for contributors to help your pull request be accepted without major changes.
* [Project Overview](#project-overview)
* [Coding Conventions](#coding-conventions)
* [General Guidelines](#general-guidelines)
* [What does the Code of Conduct mean for me?](#what-does-the-code-of-conduct-mean-for-me)
## I Don't Want To Read This Whole Thing I Just Have a Question!
If you'd like to ask questions about QMK you can do so on the [OLKB Subreddit](https://reddit.com/r/olkb) or on [Gitter](https://gitter.im/qmk/qmk_firmware).
Please keep these things in mind:
* It may take several hours for someone to respond to your question. Please be patient!
* Everyone involved with QMK is donating their time and energy. We don't get paid to work on or answer questions about QMK.
* Try to ask your question so it's as easy to answer as possible. If you're not sure how to do that these are some good guides:
QMK is largely written in C, with specific features and parts written in C++. It targets embedded processors found in keyboards, particularly AVR ([LUFA](http://www.fourwalledcubicle.com/LUFA.php)) and ARM ([ChibiOS](http://www.chibios.com)). If you are already well versed in Arduino programming you'll find a lot of the concepts and limitations familiar. Prior experience with Arduino is not required to successfully contribute to QMK.
<!-- FIXME: We should include a list of resources for learning C here. -->
# Where can I go for help?
If you need help you can [open an issue](https://github.com/qmk/qmk_firmware/issues) or [chat on gitter](http://gitter.im/QMK/qmk_firmware).
# How Do I Make a Contribution?
Never made an open source contribution before? Wondering how contributions work in QMK? Here's a quick rundown!
0. Sign up for a [GitHub](https://github.com) account.
1. Put together a keymap to contribute, [find an issue](https://github.com/qmk/qmk_firmware/issues) you are interested in addressing, or [a feature](https://github.com/qmk/qmk_firmware/issues?q=is%3Aopen+is%3Aissue+label%3Afeature) you would like to add.
2. Fork the repository associated with the issue to your GitHub account. This means that you will have a copy of the repository under `your-GitHub-username/qmk_firmware`.
3. Clone the repository to your local machine using `git clone https://github.com/github-username/repository-name.git`.
4. If you're working on a new feature consider opening an issue to talk with us about the work you're about to undertake.
5. Create a new branch for your fix using `git checkout -b branch-name-here`.
6. Make the appropriate changes for the issue you are trying to address or the feature that you want to add.
7. Use `git add insert-paths-of-changed-files-here` to add the file contents of the changed files to the "snapshot" git uses to manage the state of the project, also known as the index.
8. Use `git commit -m "Insert a short message of the changes made here"` to store the contents of the index with a descriptive message.
9. Push the changes to your repository on GitHub using `git push origin branch-name-here`.
10. Submit a pull request to [QMK Firmware](https://github.com/qmk/qmk_firmware/pull/new/master).
11. Title the pull request with a short description of the changes made and the issue or bug number associated with your change. For example, you can title an issue like so "Added more log outputting to resolve #4352".
12. In the description of the pull request explain the changes that you made, any issues you think exist with the pull request you made, and any questions you have for the maintainer. It's OK if your pull request is not perfect (no pull request is), the reviewer will be able to help you fix any problems and improve it!
13. Wait for the pull request to be reviewed by a maintainer.
14. Make changes to the pull request if the reviewing maintainer recommends them.
15. Celebrate your success after your pull request is merged!
# Coding conventions
Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines:
* We indent using two spaces (soft tabs)
* We use One True Brace Style
* Opening Brace: At the end of the same line as the statement that opens the block
* Closing Brace: Lined up with the first character of the statement that opens the block
* Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line.
* Optional Braces: Always include optional braces.
* Good: if (condition) { return false; }
* Bad: if (condition) return false;
* We use C style comments: /* */
* Think of them as a story describing the feature
* Use them liberally to explain why particular decisions were made.
* Do not write obvious comments
* If you not sure if a comment is obvious, go ahead and include it.
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
# General Guidelines
We have a few different types of changes in QMK, each requiring a different level of rigor. We'd like you to keep the following guidelines in mind no matter what type of change you're making.
* Separate PR's into logical units. For example, do not submit one PR covering two separate features, instead submit a separate PR for each feature.
* Check for unnecessary whitespace with `git diff --check` before committing.
* Make sure your code change actually compiles.
* Keymaps: Make sure that `make keyboard:your_new_keymap` does not return an error
* Keyboards: Make sure that `make keyboard:all` does not return any errors
* Core: Make sure that `make all` does not return any errors.
* Make sure commit messages are understandable on their own. You should put a short description (no more than 70 characters) on the first line, the second line should be empty, and on the 3rd and later lines you should describe your commit in detail, if required. Example:
```
Adjust the fronzlebop for the kerpleplork
The kerpleplork was intermittently failing with error code 23. The root cause was the fronzlebop setting, which causes the kerpleplork to activate every N iterations.
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
```
## Documentation
Documentation is one of the easiest ways to get started contributing to QMK. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren't sure where or how to jump in please [reach out for help](#where-can-i-go-for-help)!
You'll find all our documentation in the `qmk_firmware/docs` directory, or if you'd rather use a web based workflow you can click "Suggest An Edit" at the top of each page on http://docs.qmk.fm/.
## Keymaps
Most first-time QMK contributors start with their personal keymaps. We try to keep keymap standards pretty casual (keymaps, after all, reflect the personality of their creators) but we do ask that you follow these guidelines to make it easier for others to discover and learn from your keymap.
* Write a `readme.md` using [the template](https://docs.qmk.fm/documentation_templates.html#).
* All Keymap PR's are squashed, so if you care about how your commits are squashed you should do it yourself
* Do not lump features in with keymap PR's. Submit the feature first and then a second PR for the keymap.
* Do not include `Makefile`s in your keymap folder (they're no longer used)
* Update copyrights in file headers (look for `REPLACE_WITH_YOUR_NAME `)
## Keyboards
Keyboards are the raison d'être for QMK. Some keyboards are community maintained, while others are maintained by the people responsible for making a particular keyboard. The `readme.md` should tell you who maintains a particular keyboard. If you have questions relating to a particular keyboard you can [Open An Issue](https://github.com/qmk/qmk_firmware/issues) and tag the maintainer in your question.
We also ask that you follow these guidelines:
* Write a `readme.md` using [the template](https://docs.qmk.fm/documentation_templates.html#).
* Keep the number of commits reasonable or we will squash your PR
* Do not lump core features in with new keyboards. Submit the feature first and then submit a separate PR for the keyboard.
* Name `.c`/`.h` file after the immediate parent folder, eg `/keyboards/<kb1>/<kb2>/<kb2>.[ch]`
* Do not include `Makefile`s in your keyboard folder (they're no longer used)
* Update copyrights in file headers (look for `REPLACE_WITH_YOUR_NAME `)
## Quantum/TMK Core
Before you put a lot of work into building your new feature you should make sure you are implementing it in the best way. You can get a basic understanding of QMK by reading [Understaning QMK](understanding_qmk.html), which will take you on a tour of the QMK program flow. From here you should talk to us to get a sense of the best way to implement your idea. There are two main ways to do this:
* [Chat on Gitter](https://gitter.im/qmk/qmk_firmware)
* [Open an Issue](https://github.com/qmk/qmk_firmware/issues/new)
Feature and Bug Fix PR's affect all keyboards. We are also in the process of restructuring QMK. For this reason it is especially important for significant changes to be discussed before implementation has happened. If you open a PR without talking to us first please be prepared to do some significant rework if your choices do not mesh well with our planned direction.
Here are some things to keep in mind when working on your feature or bug fix.
* **Disabled by default** - memory is a pretty limited on most chips QMK supports, and it's important that current keymaps aren't broken, so please allow your feature to be turned **on**, rather than being turned off. If you think it should be on by default, or reduces the size of the code, please talk with us about it.
* **Compile locally before submitting** - hopefully this one is obvious, but things need to compile! Our Travis system will catch any issues, but it's generally faster for you to compile a few keyboards locally instead of waiting for the results to come back.
* **Consider revisions and different chip-bases** - there are several keyboards that have revisions that allow for slightly different configurations, and even different chip-bases. Try to make a feature supported in ARM and AVR, or automatically disabled on platforms it doesn't work on.
* **Explain your feature** - Document it in `docs/`, either as a new file or as part of an existing file. If you don't document it other people won't be able to benefit from your hard work.
We also ask that you follow these guidelines:
* Keep the number of commits reasonable or we will squash your PR
* Do not lump keyboards or keymaps in with core changes. Submit your core changes first.
* Write [Unit Tests](http://docs.qmk.fm/unit_testing.html) for your feature
* Follow the style of the file you are editing. If the style is unclear or there are mixed styles you should conform to the [coding conventions](#coding-conventions) above.
## Refactoring
To maintain a clear vision of how things are laid out in QMK we try to plan out refactors in-depth and have a collaborator make the changes. If you have an idea for refactoring, or suggestions, [open an issue](https://github.com/qmk/qmk_firmware/issues), we'd love to talk about how QMK can be improved.
# What does the Code of Conduct mean for me?
Our [Code of Conduct](https://github.com/qmk/qmk_firmware/blob/master/CODE_OF_CONDUCT.md) means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.
This page documents the templates you should use when submitting new Keymaps and Keyboards to QMK.
## Keymap `readme.md` Template
Most keymaps have an image depicting the layout. You can use [Keyboard Layout Editor](http://keyboard-layout-editor.com) to create an image. Upload it to [Imgur](http://imgur.com) or another hosting service, please do not include images in your Pull Request.
Below the image you should write a short description to help people understand your keymap.
Make example for this keyboard (after setting up your build environment):
make planck/rev4:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
```
There needs to be two spaces at the end of the `Keyboard Maintainer` and `Hardware Supported` lines for it to render correctly with Markdown.
@ -92,7 +92,7 @@ First you have to compile frimware with this build option `NKRO_ENABLE` in **Mak
Try `Magic`**N** command(`LShift+RShift+N` by default) when **NKRO** still doesn't work. You can use this command to toggle between **NKRO** and **6KRO** mode temporarily. In some situations **NKRO** doesn't work you need to switch to **6KRO** mode, in particular when you are in BIOS.
If your firmeare built with `BOOTMAGIC_ENABLE` you need to turn its switch on by `BootMagic`**N** command(`Space+N` by default). This setting is stored in EEPROM and keeped over power cycles.
If your firmware built with `BOOTMAGIC_ENABLE` you need to turn its switch on by `BootMagic`**N** command(`Space+N` by default). This setting is stored in EEPROM and keeped over power cycles.
If you are using a TeensyUSB, there is a [known bug](https://github.com/qmk/qmk_firmware/issues/164) in which the hardware reset button prevents the RESET key from working. Unplugging the keyboard and plugging it back in should resolve the problem.
## Special Extra key doesn't work(System, Audio control keys)
You need to define `EXTRAKEY_ENABLE` in `rules.mk` to use them in QMK.
## What Differences Are There Between QMK and TMK?
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert's](https://github.com/jackhumbert) fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert](https://github.com/jackhumbert)'s fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
From a technical standpoint QMK builds upon TMK by adding several new features. Most notably QMK has expanded the number of available keycodes and uses these to implement advanced features like `S()`, `LCTL()`, and `MO()`. You can see a complete list of these keycodes in [Keycodes](keycodes.md).
@ -7,6 +7,17 @@ See [Keycodes](keycodes.md) for an index of keycodes available to you. These lin
Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h).
## What Are The Default Keycodes?
There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here:
<!-- Source for this image: http://www.keyboard-layout-editor.com/#/gists/9ce023dc6caadc0cf11c88c782350a8c -->
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when that key was invented there was already a key named `MENU` in the relevant standards, so MS chose to call that the `APP` key.
## `KC_SYSREQ` isn't working
Use keycode for Print Screen(`KC_PSCREEN` or `KC_PSCR`) instead of `KC_SYSREQ`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.
Your keymap can include shortcuts to common operations, for example shifted keys. This page documents the functions that are available to you.
Your keymap can include keycodes that are more advanced than normal, for example shifted keys. This page documents the functions that are available to you.
### Assigning Custom Names
People often define custom names using `#define`. For example:
@ -15,7 +17,7 @@ This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping i
Currently, the keycodes able to used with these functions are limited to the [Basic Keycodes](keycodes_basic.html), meaning you can't use keycodes like `KC_TILD`, or anything greater than 0xFF. For a full list of the keycodes able to be used see [Basic Keycodes](keycodes_basic.html).
## Switching and toggling layers
# Switching and toggling layers
These functions allow you to activate layers in various ways.
@ -25,7 +27,7 @@ These functions allow you to activate layers in various ways.
* `TO(layer)` - Goes to a layer. This code is special, because it lets you go either up or down the stack -- just goes directly to the layer you want. So while other codes only let you go _up_ the stack (from layer 0 to layer 3, for example), `TO(2)` is going to get you to layer 2, no matter where you activate it from -- even if you're currently on layer 5. This gets activated on keydown (as soon as the key is pressed).
* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, the layer becomes active, and then deactivates when you let go. And if you tap it, the layer simply becomes active (toggles on). It needs 5 taps by default, but you can set it by defining `TAPPING_TOGGLE`, for example, `#define TAPPING_TOGGLE 2` for just two taps.
## Working With Layers
# Working With Layers
Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems.
@ -39,7 +41,7 @@ If you are just getting started with QMK you will want to keep everything simple
### Intermediate Users
Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as multually exclusive. When one base layer is on the others are off.
Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off.
### Advanced Users
@ -47,7 +49,9 @@ Once you have a good feel for how layers work and what you can do, you can get m
Layers stack on top of each other in numerical order. When determining what a keypress does, QMK scans the layers from the top down, stopping when it reaches the first active layer that is not set to `KC_TRNS`. As a result if you activate a layer that is numerically lower than your current layer, and your current layer (or another layer that is active and higher than your target layer) has something other than `KC_TRNS`, that is the key that will be sent, not the key on the layer you just activated. This is the cause of most people's "why doesn't my layer get switched" problem.
## Modifier keys
Sometimes, you might want to switch between layers in a macro or as part of a tap dance routine. `layer_on` activates a layer, and `layer_off` deactivates it. More layer-related functions can be found in [action_layer.h](../tmk_core/common/action_layer.h).
# Modifier keys
These functions allow you to combine a mod with a keycode. When pressed the keydown for the mod will be sent first, and then *kc* will be sent. When released the keyup for *kc* will be sent and then the mod will be sent.
@ -67,7 +71,7 @@ You can also chain these, like this:
LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress.
## Shifted Keycodes
# Shifted Keycodes
The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols.
@ -95,7 +99,7 @@ The following shortcuts automatically add `LSFT()` to keycodes to get commonly u
| KC_PIPE | | |
| KC_COLN | : |
## Mod Tap
# Mod Tap
`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down.
@ -125,7 +129,7 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac
* `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped
* `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift.
## One Shot Keys
# One Shot Keys
One shot keys are keys that remain active until the next key is pressed, and then are releasd. This allows you to type keyboard combinations without pressing more than one key at a time.
@ -143,6 +147,8 @@ You can control the behavior of one shot keys by defining these in `config.h`:
* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](#mod-tap), not the `KC_*` codes.
* `OSL(layer)` - momentary switch to *layer*.
Sometimes, you want to activate a one-shot layer as part of a macro or tap dance routine. To do this, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. For more complicated actions, take a look at the oneshot implementation in [`process_record`](../tmk_core/common/action.c#L429).
## Permissive Hold
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
Tap a key and you get its character. Tap a key, but hold it *slightly* longer
and you get its shifted state. Viola! No shift key needed!
## Why Auto Shift?
Many people suffer from various forms of RSI. A common cause is stretching your
fingers repetitively long distances. For us on the keyboard, the pinky does that
all too often when reaching for the shift key. Auto Shift looks to alleviate that
problem.
## How does it work?
When you tap a key, it stays depressed for a short period of time before it is
then released. This depressed time is a different length for everyone. Auto Shift
defines a constant `AUTO_SHIFT_TIMEOUT` which is typically set to twice your
normal pressed state time. When you press a key, a timer starts and then stops
when you release the key. If the time depressed is greater than or equal to the
`AUTO_SHIFT_TIMEOUT`, then a shifted version of the key is emitted. If the time
is less than the `AUTO_SHIFT_TIMEOUT` time, then the normal state is emitted.
## Are there limitations to Auto Shift?
Yes, unfortunately.
1. Key repeat will cease to work. For example, before if you wanted 20 'a'
characters, you could press and hold the 'a' key for a second or two. This no
longer works with Auto Shift because it is timing your depressed time instead
of emitting a depressed key state to your operating system.
2. Auto Shift is disabled for any key press that is accompanied by one or more
modifiers. Thus, Ctrl+A that you hold for a really long time is not the same
as Ctrl+Shift+A.
3. You will have characters that are shifted when you did not intend on shifting, and
other characters you wanted shifted, but were not. This simply comes down to
practice. As we get in a hurry, we think we have hit the key long enough
for a shifted version, but we did not. On the other hand, we may think we are
tapping the keys, but really we have held it for a little longer than
anticipated.
## How do I enable Auto Shift?
Add to your `rules.mk` in the keymap folder:
AUTO_SHIFT_ENABLE = yes
If no `rules.mk` exists, you can create one.
Then compile and install your new firmware with Auto Key enabled! That's it!
## Configuring Auto Shift
If desired, there is some configuration that can be done to change the
behavior of Auto Shift. This is done by setting various variables the
`config.h` file located in your keymap folder. If no `config.h` file exists, you can create one.
A sample is
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h"
#define AUTO_SHIFT_TIMEOUT 150
#define NO_AUTO_SHIFT_SPECIAL
#endif
### AUTO_SHIFT_TIMEOUT (value in ms)
This controls how long you have to hold a key before you get the shifted state.
Obviously, this is different for everyone. For the common person, a setting of
135 to 150 works great. However, one should start with a value of at least 175, which
is the default value. Then work down from there. The idea is to have the shortest time required to get the shifted state without having false positives.
Play with this value until things are perfect. Many find that all will work well
at a given value, but one or two keys will still emit the shifted state on
occassion. This is simply due to habit and holding some keys a little longer
than others. Once you find this value, work on tapping your problem keys a little
quicker than normal and you will be set.
{% hint style='info' %}
Auto Shift has three special keys that can help you get this value right very
quick. See "Auto Shift Setup" for more details!
{% endhint %}
### NO_AUTO_SHIFT_SPECIAL (simple define)
Do not Auto Shift special keys, which include -_, =+, [{, ]}, ;:, '", ,<, .>,
and /?
### NO_AUTO_SHIFT_NUMERIC (simple define)
Do not Auto Shift numeric keys, zero through nine.
### NO_AUTO_SHIFT_ALPHA (simple define)
Do not Auto Shift alpha characters, which include A through Z.
## Using Auto Shift Setup
This will enable you to define three keys temporailiy to increase, decrease and report your `AUTO_SHIFT_TIMEOUT`.
# Dynamic macros: record and replay macros in runtime
QMK supports temporarily macros created on the fly. We call these Dynamic Macros. They are defined by the user from the keyboard and are lost when the keyboard is unplugged or otherwise rebooted.
QMK supports temporary macros created on the fly. We call these Dynamic Macros. They are defined by the user from the keyboard and are lost when the keyboard is unplugged or otherwise rebooted.
You can store one or two macros and they may have a combined total of 128 keypresses. You can increase this size at the cost of RAM.
@ -22,7 +22,7 @@ enum planck_keycodes {
It must be the last element because `dynamic_macros.h` will add some more keycodes after it.
Below it include the `dynamic_macro.h` header:
Below it, include the `dynamic_macro.h` header:
```c
#include "dynamic_macro.h"`
@ -58,6 +58,6 @@ For users of the earlier versions of dynamic macros: It is still possible to fin
}
```
If the LED's start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
For the details about the internals of the dynamic macros, please read the comments in the `dynamic_macro.h` header.
@ -43,15 +43,15 @@ The folder name must be added to the keyboard's `rules.mk`:
LAYOUTS = 60_ansi
`LAYOUTS` can be appended in the subproject's `rules.mk`:
`LAYOUTS` can be set in any keyboard folder level's `rules.mk`:
LAYOUTS += 60_iso
LAYOUTS = 60_iso
but the `LAYOUT_<layout>` variable must be defined in `<subproject>.h` as well.
but the `LAYOUT_<layout>` variable must be defined in `<folder>.h` as well.
## Tips for making layouts keyboard-agnostic
Instead of using `#include "planck.h"`, you can use this line to include whatever `<keyboard>.h` (`<subproject>.h` should not be included here) file that is being compiled:
Instead of using `#include "planck.h"`, you can use this line to include whatever `<keyboard>.h` (`<folder>.h` should not be included here) file that is being compiled:
#include QMK_KEYBOARD_H
@ -61,17 +61,16 @@ In your config.h, you can also use this variable to include the keyboard's `conf
If you want to keep some keyboard-specific code, you can use these variables to escape it with an `#ifdef` statement:
* `KEYBOARD_<keyboard>`
* `SUBPROJECT_<subproject>`
* `KEYBOARD_<folder1>_<folder2>`
For example:
```c
#ifdef KEYBOARD_planck
#ifdefSUBPROJECT_rev4
#ifdefKEYBOARD_planck_rev4
planck_rev4_function();
#endif
#endif
```
Note that the names are lowercase and match the folder/file names for the keyboard/subproject exactly.
Note that the names are lowercase and match the folder/file names for the keyboard/revision exactly.
Pointing Device is a generic name for a feature intended to be generic: moving the system pointer arround. There are certainly other options for it - like mousekeys - but this aims to be easily modifiable and lightweight. You can implement custom keys to control functionality, or you can gather information from other peripherals and insert it directly here - let QMK handle the processing for you.
To enable Pointing Device, uncomment the following line in your rules.mk:
```
POINTING_DEVICE_ENABLE = yes
```
To manipulate the mouse report, you can use the following functions:
* `pointing_device_get_report()` - Returns the current report_mouse_t that represents the information sent to the host computer
* `pointing_device_set_report(report_mouse_t newMouseReport)` - Overrides and saves the report_mouse_t to be sent to the host computer
Keep in mind that a report_mouse_t (here "mouseReport") has the following properties:
* `mouseReport.x` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing movement (+ to the right, - to the left) on the x axis.
* `mouseReport.y` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing movement (+ upward, - downward) on the y axis.
* `mouseReport.v` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing vertical scrolling (+ upward, - downward).
* `mouseReport.h` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing horizontal scrolling (+ right, - left).
* `mouseReport.buttons` - this is a uint8_t in which the last 5 bits are used. These bits represent the mouse button state - bit 3 is mouse button 5, and bit 7 is mouse button 1.
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in "pointing_device_send()", which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
In the following example, a custom key is used to click the mouse and scroll 127 units vertically and horizontally, then undo all of that when released - because that's a totally useful function. Listen, this is an example:
@ -227,6 +227,26 @@ Fine control over the scrolling is supported with the following defines:
#define PS2_MOUSE_SCROLL_DIVISOR_V 2
```
#### Invert mouse and scroll axes
To invert the X and Y axes you can put:
```
#define PS2_MOUSE_INVERT_X
#define PS2_MOUSE_INVERT_Y
```
into config.h.
To reverse the scroll axes you can put:
```
#define PS2_MOUSE_INVERT_H
#define PS2_MOUSE_INVERT_V
```
into config.h.
#### Debug settings
To debug the mouse, add `debug_mouse = true` or enable via bootmagic.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.