* Fix Unicode sample
* Add irony mark
* Remove unpretty keymaps
* Add QMK DFU and Conditional Music Mode
* Unicode fixes
* Unicode fixes
* Make layer indication more modular
* Finish removing Faux Click
* Cleanup of UserSpace and addition of 'update_tri_layer_state' function
* Add modifier status indicators to Orthodox
* Remove tri layer function
* Minor tweaks
* Remove the Orthodox's Indicator's reliance on layer_state_set
* Add custom EEPROM settings
* Make EEPROM config more efficient
* Viterbi Config
* Add Iris Keyboard layout and Userspace cleanup
* Iris keyboard tweaks
* Use Grave Escape on Iris
* Update Readmes
* edited keymap and fitted for tada68
* edited rules to make mouse work
* filled config.h to make mouse cursor move smooth
* added descriptive readme
* added layout with split backspace and steamlined naming
* added layout with split shift, split backspace and split #
* changed keymap to fit the new layout
* removed duplicate layout KEYMAP_FAKB and pointed keymap.c to default on
* further cleanup from layout duplicate
* add some comment about Helix customize and auto-setup RGBLIGHT_LIMIT_VAL
* add define USB_MAX_POWER_CONSUMPTION
* Helix keyboard OLED, RGBLIGHT enable/disable control integrate into rules.mk
rules.mk: add 4 Variables for compile control.
# Helix keyboard customize
# you can edit follows 4 Variables
# jp: 以下の4つの変数を必要に応じて編集します。
OLED_ENABLE = no # OLED_ENABLE
LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.)
LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.)
LED_ANIMATIONS = yes # LED animations
config.h: auto set RGBLED_NUM by HELIX_ROWS and rules.mk's define
* HELIX_ROWS define move from config.h to rules.mk
* add readme.md
* rename readme.md to readme_jp.md
* add readme.md and modify readme_jp.md
* change helix/ssd1306.c for select glcdfont.c position
* add variable LOCAL_GLCDFONT into each keymaps rules.mk
* copied lets_slit to splinter
* initial splinter layout
* remove unused keymaps
* implemented second half of the keyboard
* initial definition of tap dance
* the tap dance is working now
tap dance for right hand 4c 2r
hold - shift
single tap - n
double tap - ñ
triple tap - Ñ
* clear the keymap.c
* put the tap state on to array
* the n tilde tap dance should produce right shift if hold
* add esc grv tap dance
* remove the defined SS_LSFT on tap_dance.h
because it was added on the quantum.h
* minor cleanup for the keymap
* use the X_* on tap dance
* added super alt tap dance
* use the NO_TAP on tap dance reset
* allow track what rows and cols pressed
* added the RGUI_ALT
* keymap arrangement
* use i2c
* initial rgb
* layer colors
* initial rgb pressed key
* set the layers led
* SUCCESS!!!
* cleaning
* improve shifted layer
* led brightness
* initial caps rainbow
* rename SET_LED_RGB to SET_LED_RGB_HEX
* clean the SET_LED_RGB_HEX and added SET_LED_RGB
* clean format
* caps lock rainbow
* rename key_led to set_key_led
* caps lock rainbow enhanced
* make varibiables static
* change back the loop max value to 360 for the rainbow
* add scroll lock to the rainbow led
* fix pos calculation of right hand board
* add ative keys and make rainbow color can override by key press
* remove the TOTAL_MATRIX_POINTS
* some improvments for the rgb
* call the rgblight_set on the process_record_user
* some enhancement for the leds
* pass the dim value to set_layer_led and limit the brightness on _VL
set the brightness to 2 if the dim value is less than 2 because
their is not enought power for the leds.
* remove the rgb steps on the config
* use the non rev config
* remove all the revisions
* favor i2c instead of serial and remove all the ref for the serial
* clang formatting
* allow to save to eeprom the brightness value
* add bootloader caterina this will enable soft reset key
* initial commit for the userspace
* added my own keymap for splinter
* first working userspace
* move splinter to handwired keyboards
* handwired splinter default keymap
* move some config to my keymap
* cleanup some headers on the keymap
* move the EECONFIG_RGB_DIM to the user space
* I fix remove the GUI on SPC and ENT
* remove the default include on tap_dance.c
* add lights.c and refactoring
* fix wrong source for led index
* seperate the variable on set_layer_led for readabilty.
* set the usb max power consumption to 50
* fix led lighting
* add new enums for tap dance
* use romeve path avr on eeprom.h
* fix wrong spelling on TP names
* changed the tap dance
* allow to set rainbow on some pressed key
* add reset key
* fix error on matrix.c if ROW2COL is used
* add extraflags -flto
* See e2352d4
* Got no love from i2c, serial to the rescue
* Fix the led will lit up to color red after boot
* Trial if the power can handle yellow color at full
* Add comment
* Use EE_HANDS
* add config.h in the use space
* KC_N on BL should wrap in SFT_T
* See d13567d, put it back but increase 1 level
* Fix led soldering mistake
* set the tapping_term to 100
* Use TT for the changing the layer
* Remove the changing space to enter and vice version on BL and UL
* Increate the tapping term
* Use tap dance on changing layer
* Add assorted layer
* propery way to tapdance
* Remove DA_EGRV
This also fix the wrong placement of the reset and dance lspr should register
the KC_LGUI on finished not unregistered.
* Remove the media control to the up and down layer
* Remove the interrupted state of the tap dance
* swapt the space and enter on to th caps
* Shorthand
* Keymap update
* My keymap for lets_split
* cleaning
* edited keymap and fitted for tada68
* edited rules to make mouse work
* filled config.h to make mouse cursor move more smooth
* added descriptive readme
* added hhkb eric
* dz60 and hhkb
* editted eric hhkb and dz60
* Added HHKB Config
* Removed HHKB Config
* Added HHKB Config
* Changed the legends on HHKB info.json
* Added Tada68 ISO Config and Staryu
* Removed Tada68 ISO Config
* Add naKey on behalf of ckeys
* Update James's code to more modern QMK standards
* Add info.json for QMK Configurator support
* Fix that build breakage
* Rename naKey.c to nakey.c
* Rename naKey.h to nakey.h
* Use the new debounce algorithm in dactyl/matrix.c [#2065]
This incorporates the fixed/optimized debounce code added to
quantum/matrix.c in:
* 508eddf8ba
* 4c6960835c
* 32f88c0717
* f403028974
* a06115df19
* Fix the row/column swap in dactyl [#2065]
With a column-driven keyboard, reading from the mcp23081 returns a
column-state, which takes some extra work to translate into the
row-state used in the actual matrix. The ergodox_ez code sidestepped
that problem by calling rows "columns" and columns "rows." With this
change, the dactyl now calls rows "rows" and columns "columns."
* Cleanup: variable names, documentation [#2065]
* Support MATRIX_MASKED in dactyl/matrix.c [#2065]
* Only unselect one col in unselect_col [#2065]
Bonus: saves one i2c transaction per matrix_scan!
* Implement COL2ROW in dactyl/matrix.c [#2065]
* Fix a typo in dactyl/matrix.c
This entirely doesn't matter. The PORT values are set during
init_keyboard and never change. They're repeatedly set to the same
thing. These PORT lines shouldn't even exist, but since they do, they
should at least look right.
* Implement COL_PINS/ROW_PINS for dactyl [#2065]
* Rename "mcp23018" to "expander" [#2065]
I honestly don't know whether/how well this code works with other I/O
expanders, but at least in theory, it should be generic enough to work
with others. Given that, the variable names shouldn't refer to a
specific model of expander.
* Remove matrix_power_up from dactyl/matrix.c [#2065]
It's commented out in quantum/matrix.c, and the dactyl has no power
up/down behavior beyond being unplugged (which goes to matrix_init), so
there's no sense keeping it around.
* Only initialize expander_input_mask once [#2065]
...and rename input_mask to expander_input_mask, since now that it isn't
scoped to init_expander it isn't clear that it's only for the expander.
* Rename LAYOUT to LAYOUT_all
Add additional layouts for the pearl with all splits
and the pearl with splits but a 6.25u spacebar.
* add new layouts to info.json
* Change handling of adjust layer to make it more LT(...) friendly.
* Update based on feedback from drashna.
* Change handling of adjust layer to make it more LT(...) friendly. This reworks handling to make it a little more friendly to include in keymaps.
* QMK Configurator updates for the Pearl 40%
Attempt to get the physical layout as displayed in the Configurator more true-to-life.
* Bugfixes per mechmerlin
"By changing KEYMAP to LAYOUT in the .h file, all the keymaps who rely on KEYMAP are now broken. You need to go into the keymap directory and fix all the keymaps affected by this change. Should just be an issue of renaming KEYMAP to LAYOUT."
* Merge pull request #2 from noroadsleft/noroadsleft-patch-20180425
Bugfixes per mechmerlin
* keymap.c updates for Pearl
-#include "pearl.h"
+#QMK_KEYBOARD_H
* Update config.h
Matrix pinout updated to current revision.
* Add updated matrix, define RGB pin
Matrix updated to current pinout, pin for WS2812 defined.
* Added Modular keyboards L,R and NUM
Created code modules for the 3 modules of the modular keyboard.
Original idea by MechboardsUK. Uses i2c implementation similar to lets
split
* Remove modular from master
This is to fix incorrect branching
* CU75 keymap fix
Incorrect keymap now fixed
* Add new project files for UT47
* Copy over keymap and related files
* Add LED_controls.ino
* Add README instructions
* Attempt sending press byte data
* Disable mousekeys
* Enable sending serial data to LED controller
* Update LED mode names
* Remove extra file
* Add LED enable flag
* Update READMEs with more info
* Credit original author
* Update copyrights
* Update docs
* Changed based on review
* Move layout screenshot to Imgur
* Append to src
* Enable mousekeys to fix bad keycodes
* Additional changes based on feedback
* Fix fn layer keys
* Helix keyboard OLED, RGBLIGHT enable/disable control integrate into rules.mk
rules.mk: add 4 Variables for compile control.
# Helix keyboard customize
# you can edit follows 4 Variables
# jp: 以下の4つの変数を必要に応じて編集します。
OLED_ENABLE = no # OLED_ENABLE
LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.)
LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.)
LED_ANIMATIONS = yes # LED animations
config.h: auto set RGBLED_NUM by HELIX_ROWS and rules.mk's define
* HELIX_ROWS define move from config.h to rules.mk
* add readme.md
* rename readme.md to readme_jp.md
* add readme.md and modify readme_jp.md
* nyquist
* danielhklein nyquist setup
* shift left controls
* remove readme
* cleanup before pr
* ready for pr
* updated bootmagic, arrows, and special chars
* allow gui on arrows
* replace arrows with right modifiers
* documentation re-added
* updated personal repo
* fixes to layers
* DRambo Planck keymap in Colemak
* DRambo Planck keymap in Colemak
* Satan GH60 keymap for Bri
QWERTY layout with Navigation layer toggled with "Caps Lock" key.
* xd75 keymap in Colemak for Mac and Win
* DRambo Planck keymap in Colemak
* Satan GH60 keymap for Bri
QWERTY layout with Navigation layer toggled with "Caps Lock" key.
* xd75 keymap in Colemak for Mac and Win
* Added Iris Colemak layout for Mac, Windows, and Gaming.
* changed comment text
* DRambo Planck keymap in Colemak
* Satan GH60 keymap for Bri
QWERTY layout with Navigation layer toggled with "Caps Lock" key.
* xd75 keymap in Colemak for Mac and Win
* Added Iris Colemak layout for Mac, Windows, and Gaming.
* changed comment text
* Added Iris keymap from DavidRambo
* Added planck keymap from DavidRambo
* Added xd75 keymap from DavidRambo
* Added readme
* Deleted redundant repos in Iris, Planck, and XD75 keymaps.
* Tweaked XD75 keymap
* DRambo Planck keymap in Colemak
* Tweaked XD75 keymap
* Merge branch 'master' of https://github.com/DavidRambo/qmk_firmware
Removed redundant repos with "Rambo" title.
* changed iris nav layers
* changed nav layers for xd75
* Updated Iris, tweaked nav on xd75
* add mechmerlin 60 ansi layout
* put meaningful #defines
* missed the backslash
* add merlin split layout
* rename to have a -ansi
* Add appropriate readme files
* rename KEYMAP to LAYOUT
* support for default layout
* support for the community keymaps
* make sure I don't break the configurator
* Don't break the configurator Merlin
* initial commit for meme keyboard
* Fix that row by column
* Fix those dimensions
* work in progress commit
* got that switch matrix to work
* add all supported layouts
* add info.json for QMK configurator support
* let my name be known
* alpha with firmware added to list of keyboards, ready to push
* revised according to drashna's fixes
* keymap -> layout?
* fixed macro and improved layout issuesOC
* Update rules.mk
* Update alpha.h
* Update and rename keyboards/alpha/layouts/default/28_alpha/keymap.c to keyboards/alpha/keymaps/default/keymap.c
* alpha/readme.md added according to qmk templateOC
* resolved a careless merge conflict
* bugfix
* Fixed /keyboards/alpha/readme.md formatting issues
* Add personal Tada68 keymaps
* remove uneccessary tada68 folder
* recommit with temp name
* remove bad folder name
* fix bullet list format
* rename to fezzant
* remove unnecessary config.h file
* Add userspace to talljoe layout.
* Move more authority to userspace and create Bananasplit layout.
* Move more things into userspace.
* Common Core example
* More work on common layout.
* Num layer.
* talljoe-ansi layout
* Updates for Zeal60
* Add Zeal60 to 60_ansi_split_bs_rshift
* Swap Escape and Grave
* Num-layer tweaks
* More tweaks.
* Add 1up60rgb to world of layouts.
* Rename ansi_split_bs_rshift layout to hhkb.
* Control RGB Backlight.
* change capslock led
* Remove obsolete line from rules.mk.
* Add user-friendly userspace override.
* Fix enter for 1uprgb60
* Revert "Rename ansi_split_bs_rshift layout to hhkb."
This reverts commit 53133719db.
* Adds initial keyboard config and layouts for ALF X2 60%
* Cleans up empty if/else blocks
* Renames KEYMAP to LAYOUT across the alf_x2 config files.
* Replaces include in alf_x2 keymaps with QMK_KEYBOARD_H macro
* Re-add NO_SECRETS option
* Add Thumb Clusters defines for default layout
* Minor tweaks
* More Minor tweaks
* Revert Orthodox layers and move function keys around
* Fix keymap so it will compile under the Infinity
Since I haven't added 'pretty' layouts to it yet
* Cleanup of userspace
* Cleanup keymaps
* OMG fix Workman
* Move mods layer key around
* Reduce debounce in Ergodox EZ
* Fix Infinity layers
* Add list of pins used by Ergdox EZ for easy reference
* Revert "Reduce debounce in Ergodox EZ"
This reverts commit 8a3db2673b419ef8032c40a6d29156cef632f9cd.
* Add Clicky toggle to Orthodox
* Fix Audio Clicky keycode
* Enable Faux Clicky by default
* Add Unicode stuff
* alpha with firmware added to list of keyboards, ready to push
* revised according to drashna's fixes
* keymap -> layout?
* fixed macro and improved layout issuesOC
* Update rules.mk
* Update alpha.h
* Update and rename keyboards/alpha/layouts/default/28_alpha/keymap.c to keyboards/alpha/keymaps/default/keymap.c
* alpha/readme.md added according to qmk templateOC
* resolved a careless merge conflict
* bugfix
* added an iso layout that supports split backspace and split rshift
* added a keymap which uses the iso layout with split backspace and split rshift
* added a #define LAYOUT_ for the KEYMAP_
* fixed missing newline
* Updated info and fixed minor errors
* Updated folder name; overdue updates to keymap and readme files
Updated folder name; overdue updates to keymap and readme files
* Change KEYMAP to LAYOUT
* add layouts that match the layouts hasu has defined for alps64
* add layouts in info.json for aek, standard, and infinity
* Add LAYOUT_iso and LAYOUT_all along with respective info.json LAYOUTs
* Line ending stuff again
* Added base launchpad files and a default layout
* Updated KEYMAP to LAYOUT, also editing default keymap a bit and added a readme
* Initial commit for donutcat's 15x15 monstrosity
* modify readmes to be more descriptive
* Add info.json to support QMK Configurator
* Update copyright and change REPLACE_WITH_YOUR_NAME to MechMerlin
* update naming convention for ScrabblePad
* remove .vscode directory as per Jack's comments
* Add Haegin's keymap
* Potential improvements to the keyboard
* Add haegin minidox layout
* Add Haegin's keyboard to ergodox layouts
* Update Haegin's minidox keymap
* Add home, end, and page up and down
* Magic Backspace
Backspace still acts as control when you hold it down, but if you tap it
twice and hold it's a held backspace. Tapping it more than twice it
continues to act as backspace, but it deletes more characters with each
tap with the quantity deleted based on the fibonacci sequence.
* Switch to deleting words after 4 taps
When hitting backspace, after 4 taps this switches to deleting by word
because if you're hitting backspace that frantically you must need to
delete a lot of stuff. Holding backspace after 4 taps will delete words
in the same way that holding alt+backspace deletes words on a normal
keyboard.
* Add Faux Clicky to main Audio feature
* Make clicky settings user configurable
* Add additional documentation
* Don't play when music mode is enabled (hopefully)
This is done via MI_BENDD and MI_BENDU. At the moment the value is
hardcoded and cannot be adjusted (future commit?) and is the max for the
`midi_send_pitchbend` function (up or down).
`MI_BENDD` and `MI_BENDU` both require `#define MIDI_ADVANCED`
MIDI pitch bend was already implemented in `protocol/midi.c`, I merely
added the keycodes to trigger them. :) (thanks to Jack, two years ago
in commit fb4fe52c apparently)
* Copy Chibios serial_usb_driver into the chibios/protocol
It's renamed to usb_driver to avoid name conflicts
* Make the usb driver compile
* Disable ChibiOS serial usb driver for all keyboards
* Change usb_main to use QMKUSBDriver
* Initialize the usb driver buffers
* Add support for fixed size queues
* Fix USB driver initialization
* Don't transfer an empty packet for fixed size streams
* This adds a keymap to the MF68 labeled factory. It is an attempt to mimic the layout on the factory keycaps of the non-backlit board.
There are some small differences:
1) FN+WASD are an arrow cluster
2) FN+Z (Start media player) and FN+] (Start Calculator) are not mapped
3) FN+GHJKL are Backlight controls
4) An FN2 layer exists for future growth
5) The CAPS key is maped as FN2, for CAPS Lock use FN+CAPS
* Changed the CAPS key to be CAPS Lock on short press, FN2 on hold
Added LED controls to FN+Arrow Keys to better mimic factory backlit boards.
* AJP10304 layouts for Planck and JJ40 now have mouse support. Moved macros onto Adjust layer
* .gitignore for intellij iml files.
* Updated Macros to use send string
* DRambo Planck keymap in Colemak
* DRambo Planck keymap in Colemak
* Satan GH60 keymap for Bri
QWERTY layout with Navigation layer toggled with "Caps Lock" key.
* xd75 keymap in Colemak for Mac and Win
* DRambo Planck keymap in Colemak
* Satan GH60 keymap for Bri
QWERTY layout with Navigation layer toggled with "Caps Lock" key.
* xd75 keymap in Colemak for Mac and Win
* Added Iris Colemak layout for Mac, Windows, and Gaming.
* changed comment text
* DRambo Planck keymap in Colemak
* Satan GH60 keymap for Bri
QWERTY layout with Navigation layer toggled with "Caps Lock" key.
* xd75 keymap in Colemak for Mac and Win
* Added Iris Colemak layout for Mac, Windows, and Gaming.
* changed comment text
* Added Iris keymap from DavidRambo
* Added planck keymap from DavidRambo
* Added xd75 keymap from DavidRambo
* Added readme
* Change KEYMAP macro to LAYOUT macro
* Add CU24 QMK Configurator Support
- Change KEYMAP macro to LAYOUT macro
- Add new LAYOUTS to support a default numpad
* QMK Configurator Support for CU75
Add LAYOUT_all to support all layouts
Add corresponding info.json
* fix: Miss commnts.
* edit: Enter position
* Add: config.h
* Edit: Double space key
* fix: Lower and Raise
* delete: Not used keys.
* edit: change position Lower and Raise
* Add: Functions
* Cheers let's split keymap
* fixed typo on norman layer of cheers keymap for let's split
* fixed right handed mappings for home row
* cheers keymap for let's split redefinition
* updated Cheers keymap for let's split
* cheers keymap for let's split updated with some terminal macros
* renamed cheers let's split keymap to a more appropriate normacos
* updated normacos keymap doc / removed non functional keys
* reset let's split rules to default values
* added more spotlight search macros
* normalized keymap comments
* Moved numpad on lower layer
* mf68_ble did not have the correct .c and .h files
* Fix JC65 KEYMAP to LAYOUT
* Change KEYMAP to LAYOUT for s60_x
* Convert KEYMAP to LAYOUT for lets_split boards
* Convert KEYMAP to LAYOUT
* more fixes to keymap for iris
* convert KEYMAP to LAYOUT for levinson keyboard
* change losinggeneration's KEYMAP to LAYOUT
* convert KEYMAP to LAYOUT
* convert KEYMAP to LAYOUT for nyquist
* convert KEYMAP to LAYOUT
* convert KEYMAP to LAYOUT for viterbi
* convert KEYMAP to LAYOUT
* convert KEYMAP and its subsidiries to the LAYOUT standard
* convert KEYMAP and its subsidiries to the new LAYOUT standard
Some values that can never, ever, change were held in local
variables, rather than in PROGMEM. Fixed.
Change "pressed" to a signed int so the test for < 0 makes
sense, and to avoid possible weird failure modes in the
case where a key release comes in when pressed is already
zero. (Shouldn't happen, sure, but computers are weird.)
A lot of things in process_steno had external linkage for no
particular reason. They've been marked static. Stuff still
builds.
Distinguish between currently-held keys and keys that have
been held, and expose these values through a nicely-named API
so other code could, say, check on the current set of steno
chording in order to make displays. Also in passing fix up the
"state" value having external linkage so it could clash with
other people's variable declarations.
The API also provides hooks for key processing and steno chord
events, so you can monitor those events without having to
run in matrix_scan_user and recheck the values directly. Also
document these.
There is no path through processing a key that doesn't
end with a return false, so the nested return foo() are
gone and we just return false.
* change diverge 3 KC_KEYMAP to LAYOUT
* Change KEYMAP to LAYOUT for handwired arrow pad
* change M10A to LAYOUT for m10-a
* Change KC_KEYMAP to LAYOUT_kc and KEYMAP to LAYOUT for mf68
* change KC_KEYMAP to LAYOUT for nano
* Refactor to LAYOUT
* refactor to LAYOUT-ansi and LAYOUT_iso for s65
* LAYOUT conversions for lfkkeyboards
* missed a few renames
* mini1800 for lfkeyobards support of LAYOUT
* Added support for rev3 of the Atom47
* Updated Atom47 readme's
* Fix redefine error on rev2 and add maartenwut's keymap
* Fix redefine error on LEdiodes keymap
* fixed comment typo
* Fixes invalid capitalization
Uppercase yes is invalid, so make treats it as no, which is
confusing when it seems like it should have found the method
definition for unicode.
* Own keymap, comma in mitosis
Own keymap is qwerty, workman, numbers, punctuation, function/mouse
layers, gaming, unicode, numberpad.
There are some small differences:
1) FN+WASD are an arrow cluster
2) FN+Z (Start media player) and FN+] (Start Calculator) are not mapped
3) FN+GHJKL are Backlight controls
4) An FN2 layer exists for future growth
5) The CAPS key is maped as FN2, for CAPS Lock use FN+CAPS
* rename KEYMAP to LAYOUT_ALL
* Standard Layout Eagle Refactor
New layout LAYOUT_EAGLE
Got standard layout backspace working
* Remove split right shift support for standard layout eagle
* add back the KC_NO for split right shift
* Remove KC_NO from bottom row to support standard 60 layout
* Fix formatting issues with mechmerlin keymap
* remove extra KC_NO from split right shift in LAYOUT_EAGLE
* Preliminary checkin for new layout LAYOUT_VIPER
* Remove some of the KC_NO from the layout
* Fix formatting
* missed a KC_NO for the LAYOUT_EAGLE
* remove KC_NO from enter key of LAYOUT_VIPER
* some more formatting changes
* Default 60 with split left right shift and backspace
* add info.json layouts to match the new LAYOUTs
* change formatting of LAYOUT names
* propogate renames to info.json
* Change global config.h settings
* Make Shift LED brighter
* Compatibility Tweaks
* Update ASCII art and layer comments
* Add comments about MOD layer
* Change ASCII art for reset, since it was out of date
* Use Overwatch theme for Workman layer
* Fix RGB define comments
* Make sure RGB set list matches
* Stop all notes for custom Faux Click
* Switch to OSM for everything, and remove RGB Sleep
* Never use KEYMAP now
* Only enable RGB Sleep on Non-Ergodox boards
* Cleanup do to new rgblight_list.h file
* Add redirect message for RGB codes
* Update userspace documentation
* Cleanup of Userspace
Add unicode support, and cleaned up comments for ifdef statements
* Remove unneeded slashes
* Unicode handling
* Force NKRO
Add info.json
Change KEYMAP to LAYOUT_ALL to better reflect that this is a
LAYOUT that fits ALL the possible positions for switches.
We will need to make better LAYOUTS for the future.
* Initial commit: Get things compiling
* port the custom matrix code
* Update readme
* make second layer fully transparent
* populate config.h identifiers with more correct information
* Add in switch backlight support
* Enable backlight LEDs, and change pin for RGB
* port TMK version over
* remove all that TMK stuff, it didn't work lol
* Updated readme
* Fix keymap
- Change KEYMAP to LAYOUT
- Adjust formatting of table
* Edit readme to reflect NOTES
* add info.json for QMK configurator support
* Replaced placeholder with MechMerlin
This reverts the changes in #2491, so that Travis will hopefully return to automatic incrementing.
But this includes the layout and userspace excepts, as well.
This finishes fixing #2314, which mostly copies the firmware when compiling.
However, it misses `:teensy`, `:avrdude` and most importantly, `:production`
* Added cpeters1982 keymap folder in lets_split
* Deleted tap dance. need to research error
* Changed keymap to better facilitate SpaceFn
* Trying to get backlighting to work
* Added RGB backlight support
* cleared some cache files per Drashna's instructions
* mitosis/datagrok: make qwerty the default layout
* mitosis/datagrok: update readme to match qwerty default
* mitosis:datagrok: remove redundant name for transparent
meh, decided i don't need an extra key to represent "key that is
transparent because it's a modifier on a layer below." it's a maintenance
burden when moving other keys around
* mitosis:datagrok: add num lock on Blue + QWERTY T
* mitosis:datagrok: tap lshift = tab
we use tab completion a lot so let's get it onto an unmodified key somehow
* mitosis:datagrok: update readme
* mitosis:datagrok: improve notes in README
* mitosis:datagrok: note numlock in README
* configure layer 0 layout for xd60 as ANSI 60%
* update keymap with function key immediately right of spacebar;
shuffle mapping in function layer to my liking
* update readme
* grep -> $(GREP)
Some UNIXy systems (FreeBSD for example) don't use GNU grep by default.
Allow the user to specify which grep implementation to use so that
GNU grep can be specified.
* Allow using versioned avr-gcc command
Don't hardcode "avr-gcc", and allow strings such as "avr-gcc8", or
"avr-gcc-7.3.0" to match checks for "avr-gcc".
* Add Colemak Mod-DH vars
* Add Norman Layot vars
* Set Shift Indicator to include CAPS Lock as well
* Change MEH to GUI
* Add Enter to Macro layer
* Switch raise and lower layers to make more sense (to me)
* Replace unused quote on Ergodox
* Add One Shot defines
* Dim indicator LEDs
* Add short codes for KC_SECRET
* Fix typos
* Update OLKB code in userspace
* Add global userspace config.h
* add compile fix
* Automatically include from userspace
* update readme
* Re-add QMK Scan loop
* Add EEPROM reset code to all keymaps
* Shorten fauxclick sound
* Use layouts instead of keymap, when possible
* Add OSM detection to ergodox
* Convert Viterbi to LAYOUT macro
* Clean up game macros
* Because I accidently removed the C6 AUDIO define from my viterbi... Whoops
* Minor formatting
* Fix Woodpad because it's still there
* Move Ergodox keymap into layouts folder
* Add build date to version macro
* Remove PREVENT_STUCK_MODIFIERS from config
* Added some new songs and my own keymap
* Made Dodger keymap safe to use with backlight disabled
* edited layer switching and added more songs
* changed keymap to lowercase
* Inital layout
* Fix the backspace
* add a number pad
* move the backlight to the adjust layer; move ctrl and delete.
* Update from main repo
* Add initial files for custom keymap
* Light keymap mod
* Change the submodules to match the upstream fork's master branch
* Add a proper ANSI layout
Changed v60_type_r.h to have a proper ANSI layout
Modify keymaps to reflect above changes
Fix comments
* Add new layout to info.json
* Support for tada68 ansi layout.
Avoiding the iso layout as it doesn't seem correct
* whitefox support for configurator
* configurator support for jc65 PCB featuring both the qmk and ps2avrgb versions
* Added support for JJ50 from KPRepublic, no rgb or backlight control yet. Added as a layout of ymd96 at the moment (same microprocessor). Basic keymap with three layers to get started.
* Added support for JJ50
* Update feature_rgblight.md
I got caught out with this as most color pickers use a percentage NOT 0-255 for this number
* Amended description
Woops! Was focused on s/v not being a percentage i got h wrong.
* More ergonomic mousekeys
* integrate some recent hardware changes by changing the Plover keymap
* use TX Bolt support instead of Plover toggles
* switching to steno is no longer as intrusive, so this can move back to BASE
* Preonic Ergodox-Like Mac keymap: Bucktooth
This is a layout unlike most Preonics, it is taken partially from
Ergodox and classic C64 keyboards with a ton of Mac-specific features.
* Fix Mouse Left keycode
* Add mechmerlin keymap and readme for facew board
* Fix keymap
- Backspace as on the wrong key
- HHKB backspace changed to backslash
* Update keymap.c
Change TO to TG for toggle.
* initial branch
* lazy-push
* Fix schema
Updated README, readded DVORAK to keymap.
Updated dir name to lowercase.
* removed executable bit
* testing switched L_GUI position
* Generate api docs from source code
* Add a bunch of doxygen comments
* more doxygen comments
* Add the in-progress api docs
* script to generate docs from travis
* Add doc generation to the travis job
* make travis_docs.sh commit the work it does
* make sure the docs script exits cleanly
* Macro for a momentary layer switch with mods
Passes through to the existing ACTION_LAYER_MODS macro, albeit with more
limited options due to lack of space in the quantum_keycodes enum.
* Add documentation for LM layer-mod macro
* Clean up Tap Toggle documentation
* Configurator Support
- Add info.json to support existing layouts
- Add comment in sweet16.h to remind people to change info.json if
the layout changes.
* Fix dlaroe's keymap
* Add info.json file for qmk_configurator
Unfortunately none of these keymaps look like a board I've seen in
the wild. Some further tweaks will have to be done to the keymaps
directly.
* add comment indicating need to edit info.json when keymap changes
* Fix tilde in xd75 skewwhiffy
* Small tidy up
* Tidy up Colemak row
* Tidy up navigation layer
* Symbols layer redefined
* Fix UK Quote issue
* Use UK_QUOT rather than KC_QUOT
@ -31,9 +31,8 @@ This is a C header file that is one of the first things included, and will persi
#include "config_common.h"
## `config.h` Options
### Hardware Options
## Hardware Options
*`#define VENDOR_ID 0x1234`
* defines your VID, and for most DIY projects, can be whatever you want
*`#define PRODUCT_ID 0x5678`
@ -62,10 +61,18 @@ This is a C header file that is one of the first things included, and will persi
* 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 C4_AUDIO`
* enables audio on pin C4
*`#define C5_AUDIO`
* enables audio on pin C5
*`#define C6_AUDIO`
* enables audio on pin C6
*`#define B5_AUDIO`
* enables audio on pin B5 (duophony is enable if both are enabled)
* enables audio on pin B5 (duophony is enables if one of B[5-7]_AUDIO is enabled along with one of C[4-6]_AUDIO)
*`#define B6_AUDIO`
* enables audio on pin B6 (duophony is enables if one of B[5-7]_AUDIO is enabled along with one of C[4-6]_AUDIO)
*`#define B7_AUDIO`
* enables audio on pin B7 (duophony is enables if one of B[5-7]_AUDIO is enabled along with one of C[4-6]_AUDIO)
*`#define BACKLIGHT_PIN B7`
* pin of the backlight - B5, B6, B7 use PWM, others use softPWM
*`#define BACKLIGHT_LEVELS 3`
@ -83,7 +90,7 @@ This is a C header file that is one of the first things included, and will persi
* key combination that allows the use of magic commands (useful for debugging)
### Features That Can Be Disabled
## Features That Can Be Disabled
If you define these options you will disable the associated feature, which can save on code size.
@ -102,16 +109,16 @@ If you define these options you will disable the associated feature, which can s
*`#define NO_ACTION_FUNCTION`
* disable the action function (deprecated)
### Features That Can Be Enabled
## Features That Can Be Enabled
If you define these options you will enable the associated feature, which may increase your code size.
*`#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
*stores the layer a key press came from so the same layer is used when the key is released, regardless of which layers are enabled
### Behaviors That Can Be Configured
## Behaviors That Can Be Configured
*`#define TAPPING_TERM 200`
* how long before a tap becomes a hold
@ -139,7 +146,7 @@ If you define these options you will enable the associated feature, which may in
few ms of delay from this. But if you're doing chording on something with 3-4ms
scan times? You probably want this.
### RGB Light Configuration
## RGB Light Configuration
*`#define RGB_DI_PIN D7`
* pin the DI on the ws2812 is hooked-up to
@ -156,7 +163,7 @@ If you define these options you will enable the associated feature, which may in
*`#define RGBW_BB_TWI`
* bit-bangs TWI to EZ RGBW LEDs (only required for Ergodox EZ)
### Mouse Key Options
## Mouse Key Options
*`#define MOUSEKEY_INTERVAL 20`
*`#define MOUSEKEY_DELAY 0`
@ -168,9 +175,7 @@ If you define these options you will enable the associated feature, which may in
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.
## `rules.mk` Options
### Build Options
## Build Options
*`DEFAULT_FOLDER`
* Used to specify a default folder when a keyboard has more than one sub-folder.
@ -179,7 +184,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
*`LAYOUTS`
* A list of [layouts](feature_layouts.md) this keyboard supports.
### AVR MCU Options
## AVR MCU Options
*`MCU = atmega32u4`
*`F_CPU = 16000000`
*`ARCH = AVR8`
@ -193,7 +198,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
*`caterina`
*`bootloadHID`
### Feature Options
## Feature Options
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.
@ -19,13 +19,15 @@ Currently, the keycodes able to used with these functions are limited to the [Ba
# Switching and Toggling Layers
These functions allow you to activate layers in various ways.
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers)
*`MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer.
*`LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped.
*`TG(layer)` - toggles a layer on or off.
*`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.
*`DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
*`MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
*`LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers.
*`LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped.
*`TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa
*`TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed).
*`TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps.
# Working with Layers
@ -35,9 +37,9 @@ Care must be taken when switching layers, it's possible to lock yourself into a
If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers:
* Setup layer 0 as your "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.)
* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
* Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer.
*Never try to stack a highernumbered layer on top of a lower numbered layer. Doing so is tricky and errorprone.
*In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone.
### Intermediate Users
@ -49,7 +51,7 @@ 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.
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).
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](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_layer.h).
# Modifier Keys
@ -153,9 +155,11 @@ 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).
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`](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action.c#L429).
## Permissive Hold
If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop.
# Permissive Hold
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
Your keyboard can make sounds! If you've got a Planck, Preonic, or basically any AVR keyboard that allows access to the C6 or B5 port (`#define C6_AUDIO` and/or `#define B5_AUDIO`), you can hook up a simple speaker and make it beep. You can use those beeps to indicate layer transitions, modifiers, special keys, or just to play some funky 8bit tunes.
Your keyboard can make sounds! If you've got a Planck, Preonic, or basically any AVR keyboard that allows access to certain PWM-capable pins, you can hook up a simple speaker and make it beep. You can use those beeps to indicate layer transitions, modifiers, special keys, or just to play some funky 8bit tunes.
Up to two simultaneous audio voices are supported, one driven by timer 1 and another driven by timer 3. The following pins can be defined as audio outputs in config.h:
Timer 1:
`#define B5_AUDIO`
`#define B6_AUDIO`
`#define B7_AUDIO`
Timer 3:
`#define C4_AUDIO`
`#define C5_AUDIO`
`#define C6_AUDIO`
If you add `AUDIO_ENABLE = yes` to your `rules.mk`, there's a couple different sounds that will automatically be enabled without any other configuration:
@ -86,6 +97,36 @@ You can completely disable Music Mode as well. This is useful, if you're pressed
#define NO_MUSIC_MODE
## Faux Click
This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly.
*`CK_TOGG` - Toggles the status (will play sound if enabled)
*`CK_RST` - Resets the frequency to the default state
*`CK_UP` - Increases the frequency of the clicks
*`CK_DOWN` - Decreases the frequency of the clicks
The feature is disabled by default, to save space. To enable it, add this to your `config.h`:
#define AUDIO_CLICKY
Additionally, even when enabled, the feature is not enabled by default, so you would need to turn it on first. And since we don't use EEPROM to store the setting (yet), you can default this to on by adding this to your `config.h`:
#define AUDIO_CLICKY_ON
You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values:
| Option | Default Value | Description |
|--------|---------------|-------------|
| `AUDIO_CLICKY_FREQ_DEFAULT` | 440.0f | Sets the default/starting audio frequency for the clicky sounds. |
| `AUDIO_CLICKY_FREQ_MIN` | 65.0f | Sets the lowest frequency (under 60f are a bit buggy). |
| `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the the highest frequency. Too high may result in coworkers attacking you. |
| `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f| Sets the stepping of UP/DOWN key codes. |
| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical. |
## MIDI Functionality
This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile.
@ -6,7 +6,7 @@ Bootmagic is a system for configuring your keyboard while it initializes. To tri
Bootmagic Keycodes allow you to access the Bootmagic functionality after your keyboard has initialized. To use Bootmagic Keycodes you assign keycodes starting with `MAGIC_`, much in the same way you define any other key.
Command is a feature that allows you to control different aspects of your keyboard. Command used to be called Magic. Command is typically accessed by holding Left and Right Shift at the same time, although that can be customized. While it shares some functionality with Bootmagic it also allows you to access functionality that Bootmagic does not. For more information see the (Command)[feature_command.md) documentation page.
Command is a feature that allows you to control different aspects of your keyboard. Command used to be called Magic. Command is typically accessed by holding Left and Right Shift at the same time, although that can be customized. While it shares some functionality with Bootmagic it also allows you to access functionality that Bootmagic does not. For more information see the [Command](feature_command.md) documentation page.
@ -42,6 +42,8 @@ You can change the behavior of the RGB Lighting by setting these configuration v
| `RGBLIGHT_SAT_STEP` | 17 | How many steps of saturation you'd like. |
| `RGBLIGHT_VAL_STEP` | 17 | The number of levels of brightness you want. |
| `RGBLIGHT_LIMIT_VAL` | 255 | Limit the val of HSV to limit the maximum brightness simply. |
| `RGBLIGHT_SLEEP` | | `#define` this will shut off the lights when the host goes to sleep |
### Animations
@ -90,10 +92,11 @@ rgblight_disable(); // turn all lights off
rgblight_enable();// turn lights on, based on their previous state (stored in EEPROM)
rgblight_setrgb(r,g,b);// where r/g/b is a number from 0..255. Turns all the LEDs to this color
rgblight_sethsv(h,s,v);// HSV color control
rgblight_sethsv(h,s,v);// HSV color control - h is a value from 0..360 and s/v is a value from 0..255
rgblight_setrgb_at(r,g,b,LED);// control a single LED. 0 <= LED < RGBLED_NUM
rgblight_sethsv_at(h,s,v,LED);// control a single LED. 0 <= LED < RGBLED_NUM
```
You can find a list of predefined colors at [`quantum/rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h). Free to add to this list!
* More resources at the Plover [Learning Stenography](https://github.com/openstenoproject/plover/wiki/Learning-Stenography) wiki
## Interfacing with the code
The steno code has three interceptible hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things.
This function is called when a chord is about to be sent. Mode will be one of `STENO_MODE_BOLT` or `STENO_MODE_GEMINI`. This represents the actual chord that would be sent via whichever protocol. You can modify the chord provided to alter what gets sent. Remember to return true if you want the regular sending process to happen.
This function is called when a keypress has come in, before it is processed. The keycode should be one of `QK_STENO_BOLT`, `QK_STENO_GEMINI`, or one of the `STN_*` key values.
This function is called after a key has been processed, but before any decision about whether or not to send a chord. If `IS_PRESSED(record->event)` is false, and `pressed` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This is where to put hooks for things like, say, live displays of steno chords or keys.
## Keycode Reference
As defined in `keymap_steno.h`.
@ -106,3 +129,4 @@ As defined in `keymap_steno.h`.
@ -22,7 +22,7 @@ This array specifies what actions shall be taken when a tap-dance key is in acti
*`ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
*`ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
If you use more than one keyboard with a similar keymap, you might see the benefit in being able to share code between them. Create your own folder in `users/` named the same as your keymap (ideally your github username, `<name>`) with the following structure:
*`/users/<name>/` (added to the path automatically)
*`readme.md`
*`readme.md` (optional, recommended)
*`rules.mk` (included automatically)
*`<name>.h` (optional)
*`<name>.c` (optional)
*`config.h` (optional)
`<name>.c` will need to be added to the SRC in `rules.mk` like this:
@ -24,10 +25,31 @@ For example,
Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`.
Additionally, `config.h` here will be processed like the same file in your keymap folder. This is handled separately from the `<name>.h` file.
The reason for this, is that `<name>.h` won't be added in time to add settings (such as `#define TAPPING_TERM 100`), and including the `<name.h>` file in any `config.h` files will result in compile issues.
So you should use the `config.h` for QMK settings, and the `<name>.h` file for user or keymap specific settings.
## Readme
Please include authorship (your name, github username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses).
## `Config.h`
If you do add a `config,h` file, you want to make sure that it only gets processed once. So you may want to start off with something like this:
```c
#ifndef USERSPACE_CONFIG_H
#define USERSPACE_CONFIG_H
// Put normal config.h settings here:
#endif // !USERSPACE_CONFIG_H
```
You can use any option hre that you could use in your keymap's `config.h` file. You can find a list of vales [here](config_options.md).
## Example
For a brief example, checkout `/users/_example/` , or for a more detailed examples check out [`template.h`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.h) and [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in `/users/drashna/` .
This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make <keyboard>:<keymap">`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time.
Additionally, this should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely (and will dump the HEX in the ".build" folder instead).
## Override default userspace
By default the userspace used will be the same as the keymap name. In some situations this isn't desirable. For instance, if you use the [layout](feature_layouts.md) feature you can't use the same name for different keymaps (e.g. ANSI and ISO). You can name your layouts `mylayout-ansi` and `mylayout-iso` and add the following line to your layout's `rules.mk`:
@ -22,7 +22,7 @@ Given the amount of functionality that QMK exposes it's very easy to confuse new
### Bootmagic and Command
(Bootmagic)[feature_bootmagic.md) and (Command)[feature_command.md) are two related features that allow a user to control their keyboard in non-obvious ways. We recommend you think long and hard about if you're going to enable either feature, and how you will expose this functionality. Keep in mind that users who want this functionality can enable it in their personal keymaps without affecting all the novice users who may be using your keyboard as their first programmable board.
[Bootmagic](feature_bootmagic.md) and [Command](feature_command.md) are two related features that allow a user to control their keyboard in non-obvious ways. We recommend you think long and hard about if you're going to enable either feature, and how you will expose this functionality. Keep in mind that users who want this functionality can enable it in their personal keymaps without affecting all the novice users who may be using your keyboard as their first programmable board.
By far the most common problem new users encounter is accidentally triggering Bootmagic while they're plugging in their keyboard. They're holding the keyboard by the bottom, unknowingly pressing in alt and spacebar, and then they find that these keys have been swapped on them. We recommend leaving this feature disabled by default, but if you do turn it on consider setting `BOOTMAGIC_KEY_SALT` to a key that is hard to press while plugging your keyboard in.
@ -30,7 +30,7 @@ If your keyboard does not have 2 shift keys you should provide a working default
## Custom Keyboard Programming
As documented on (Customizing Functionality)[custom_quantum_functions.md] you can define custom functions for your keyboard. Please keep in mind that your users may want to customize that behavior as well, and make it possible for them to do that. If you are providing a custom function, for example `process_record_kb()`, make sure that your function calls the `_user()` version of the call too. You should also take into account the return value of the `_user()` version, and only run your custom code if the user returns `true`.
As documented on [Customizing Functionality](custom_quantum_functions.md) you can define custom functions for your keyboard. Please keep in mind that your users may want to customize that behavior as well, and make it possible for them to do that. If you are providing a custom function, for example `process_record_kb()`, make sure that your function calls the `_user()` version of the call too. You should also take into account the return value of the `_user()` version, and only run your custom code if the user returns `true`.
## Keyboard Metadata
@ -45,17 +45,8 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai
*`keyboard_name`
* A free-form text string describing the keyboard.
* Example: `Clueboard 66%`
*`manufacturer`
* A free-form text string naming the manufacturer.
* Example: `Clueboard`
*`identifier`
* The Vendor, Product, and Revision ID's joined by a :
* Example: `c1ed:2370:0001`
*`url`
* A URL to the keyboard's product page, [QMK.fm/keyboards](https://qmk.fm/keyboards) page, or other page describing information about the keyboard.
*`processor`
* The MCU or CPU this keyboard uses.
* Example: `atmega32u4` or `stm32f303`
*`bootloader`
* What bootloader this keyboard uses. Available options:
*`atmel-dfu`
@ -63,7 +54,9 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai
*`lufa-dfu`
*`qmk-dfu`
*`stm32-dfu-util`
*(FIXME: This list is incomplete.)
*`caterina`
*`halfkay`
*`bootloadHID`
*`maintainer`
* GitHub username of the maintainer, or `qmk` for community maintained boards
`public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a control change message (cc) callback.
`public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a note on callback.
`public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a note off callback.
`public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register an after touch callback.
`public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a pitch bend callback.
`public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a song position callback.
`public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | Register a program change callback.
This is only called if a more specific callback is not matched and called. For instance, if you don't register a note on callback but you get a note on message the fall through callback will be called, if it is registered.
You use the functions when you are implementing your own midi device.
You set a send function to actually send bytes via your device, this method is called when you call a send function with this device, for instance midi_send_cc
You use the midi_device_input to process input data from the device and pass it through the device's associated callbacks.
You use the midi_device_set_pre_input_process_func if you want to have a function called at the beginning of the device's process function, generally to poll for input and pass that into midi_device_input
`public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` | Process input bytes. This function parses bytes and calls the appropriate callbacks associated with the given device. You use this function if you are creating a custom device and you want to have midi input.
`public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` | Set the callback function that will be used for sending output data bytes. This is only used if you're creating a custom device. You'll most likely want the callback function to disable interrupts so that you can call the various midi send functions without worrying about locking.
`public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` | Set a callback which is called at the beginning of the midi_device_process call. This can be used to poll for input data and send the data through the midi_device_input function. You'll probably only use this if you're creating a custom device.
`struct `[`_midi_device`](docs/api_midi_device.md#struct__midi__device) | This structure represents the input and output functions and processing data for a midi device.
Process input bytes. This function parses bytes and calls the appropriate callbacks associated with the given device. You use this function if you are creating a custom device and you want to have midi input.
#### Parameters
*`device` the midi device to associate the input with
Set the callback function that will be used for sending output data bytes. This is only used if you're creating a custom device. You'll most likely want the callback function to disable interrupts so that you can call the various midi send functions without worrying about locking.
#### Parameters
*`device` the midi device to associate this callback with
*`send_func` the callback function that will do the sending
Set a callback which is called at the beginning of the midi_device_process call. This can be used to poll for input data and send the data through the midi_device_input function. You'll probably only use this if you're creating a custom device.
#### Parameters
*`device` the midi device to associate this callback with
*`midi_no_byte_func_t` the actual callback function
# struct `_midi_device` {#struct__midi__device}
This structure represents the input and output functions and processing data for a midi device.
A device can represent an actual physical device [serial port, usb port] or something virtual. You should not need to modify this structure directly.
`enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) | An enumeration of the possible packet length values.
`public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` | Test to see if the byte given is a status byte.
`public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` | Test to see if the byte given is a realtime message.
`public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` | Find the length of the packet associated with the status byte given.
`public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` | Send a control change message (cc) via the given device.
`public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | Send a note on message via the given device.
`public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | Send a note off message via the given device.
`public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` | Send an after touch message via the given device.
`public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` | Send a pitch bend message via the given device.
`public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` | Send a program change message via the given device.
`public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` | Send a channel pressure message via the given device.
`public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a clock message via the given device.
`public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a tick message via the given device.
`public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a start message via the given device.
`public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a continue message via the given device.
`public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a stop message via the given device.
`public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send an active sense message via the given device.
`public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a reset message via the given device.
`public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` | Send a tc quarter frame message via the given device.
`public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` | Send a song position message via the given device.
`public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` | Send a song select message via the given device.
`public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a tune request message via the given device.
`public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` | Send a byte via the given device.
`public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` | Send up to 3 bytes of data.
`public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` | Send an array of formatted midi data.
This is a generic method for sending data via the given midi device. This would be useful for sending sysex data or messages that are not implemented in this API, if there are any. Please contact the author if you find some so we can add them.
`public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` | Compute the length of a message after it is encoded.
`public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` | Compute the length of a message after it is decoded.
`public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` | Encode data so that it can be transmitted safely in a sysex message.
@ -171,6 +171,8 @@ In this case we've instructed QMK to call the `ACTION_FUNCTION` callback, which
> This `fn_actions[]` interface is mostly for backward compatibility. In QMK, you don't need to use `fn_actions[]`. You can directly use `ACTION_FUNCTION(N)` or any other action code value itself normally generated by the macro in `keymaps[][MATRIX_ROWS][MATRIX_COLS]`. N in `F(N)` can only be 0 to 31. Use of the action code directly in `keymaps` unlocks this limitation.
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.