mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-21 15:12:02 +00:00
explain configuration and state, illustrate callback timings
This commit is contained in:
parent
1958e4d63d
commit
14eab13c19
267
docs/features/tap-dance-doube-hold-interrupted.svg
Normal file
267
docs/features/tap-dance-doube-hold-interrupted.svg
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="257.37842mm"
|
||||||
|
height="203.21901mm"
|
||||||
|
viewBox="0 0 257.37842 203.21901"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
sodipodi:docname="tap-dance-doube-hold-interrupted.svg"
|
||||||
|
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview10375"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#111111"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:showpageshadow="0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="1"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.8884048"
|
||||||
|
inkscape:cx="514.45539"
|
||||||
|
inkscape:cy="326.20125"
|
||||||
|
inkscape:current-layer="svg5" />
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<rect
|
||||||
|
x="-469.16562"
|
||||||
|
y="-171.31531"
|
||||||
|
width="1119.4651"
|
||||||
|
height="787.95514"
|
||||||
|
id="rect13983" />
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="Arrow1L"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
markerWidth="8.75"
|
||||||
|
markerHeight="5"
|
||||||
|
viewBox="0 0 8.75 5"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
id="arrow1L"
|
||||||
|
transform="scale(-0.5)" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(20.27222,-104.88129)">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.165;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1L)"
|
||||||
|
d="m 12.896004,136.56477 c 1.573387,-0.27013 174.985566,0.43796 174.985566,0.43796"
|
||||||
|
id="path344" />
|
||||||
|
<g
|
||||||
|
id="g3305"
|
||||||
|
transform="translate(0.73059446)">
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 14.389388,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 25.508952,135.91803 -3.156917,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 50.179315,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611-35" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 160.33169,136.24301 -3.15691,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3-6" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312"
|
||||||
|
id="text3393"><tspan
|
||||||
|
id="tspan3391"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312">Time</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003"
|
||||||
|
id="text3447"><tspan
|
||||||
|
id="tspan3445"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003" /></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221"
|
||||||
|
id="text3451"><tspan
|
||||||
|
id="tspan3449"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221">Key up</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0"><tspan
|
||||||
|
id="tspan3449-63"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429">First</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0-1"><tspan
|
||||||
|
id="tspan3449-63-5"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429">2nd</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534-5">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="text3451-0-1-5"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="tspan3534-5-7">End of</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="116.98158"
|
||||||
|
id="tspan3758">Tapping</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="123.68436"
|
||||||
|
id="tspan3760">Term</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244"
|
||||||
|
id="text3451-3"><tspan
|
||||||
|
id="tspan3449-6"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244">Key down</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905"
|
||||||
|
id="text3451-4"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905">on_each_tap(count:1, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851"
|
||||||
|
id="text3451-4-9"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851">on_each_release(count:1, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748"
|
||||||
|
id="text3451-4-7"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-4"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748">on_each_tap(count:2, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="200.44789"
|
||||||
|
y="-67.038536"
|
||||||
|
id="text3451-4-9-5"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="200.44789"
|
||||||
|
y="-67.038536">on_each_release(count:2, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="203.71626"
|
||||||
|
y="-73.008339"
|
||||||
|
id="text3451-4-9-5-4-0"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2-4-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="203.71626"
|
||||||
|
y="-73.008339">on_reset(count:2, pressed:false)</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.965;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 136.8083,127.93103 -0.0323,8.87583"
|
||||||
|
id="path3722" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:#ff7f2a;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 110.9994,32.409163 3.30895,5.51131 3.24707,-5.53223 z"
|
||||||
|
id="path2611-35-8"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="113.14949"
|
||||||
|
y="8.1985655"
|
||||||
|
id="text3451-0-1-3"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="113.14949"
|
||||||
|
y="8.1985655"
|
||||||
|
id="tspan6210">Other key</tspan><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="113.14949"
|
||||||
|
y="14.901347"
|
||||||
|
id="tspan6214">interrupting</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="90.397614"
|
||||||
|
y="-79.312668"
|
||||||
|
id="text3451-4-9-5-4-9"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-7-3-2-4-2"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="90.397614"
|
||||||
|
y="-79.312668">on_dance_finished(count:2, interrupted:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
transform="matrix(0.26458333,0,0,0.26458333,113.12479,40.18937)"
|
||||||
|
id="text13981"
|
||||||
|
style="font-size:26.6667px;line-height:1.25;font-family:Impact;-inkscape-font-specification:'Impact, Normal';font-variant-ligatures:none;white-space:pre;shape-inside:url(#rect13983)" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 14 KiB |
215
docs/features/tap-dance-doube-hold.svg
Normal file
215
docs/features/tap-dance-doube-hold.svg
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="257.37842mm"
|
||||||
|
height="187.04857mm"
|
||||||
|
viewBox="0 0 257.37842 187.04857"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="Arrow1L"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
markerWidth="8.75"
|
||||||
|
markerHeight="5"
|
||||||
|
viewBox="0 0 8.75 5"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
id="arrow1L"
|
||||||
|
transform="scale(-0.5)" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(20.27222,-104.88129)">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.165;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1L)"
|
||||||
|
d="m 12.896004,136.56477 c 1.573387,-0.27013 174.985566,0.43796 174.985566,0.43796"
|
||||||
|
id="path344" />
|
||||||
|
<g
|
||||||
|
id="g3305"
|
||||||
|
transform="translate(0.73059446)">
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 14.389388,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 25.508952,135.91803 -3.156917,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 50.179315,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611-35" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 160.33169,136.24301 -3.15691,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3-6" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312"
|
||||||
|
id="text3393"><tspan
|
||||||
|
id="tspan3391"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312">Time</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003"
|
||||||
|
id="text3447"><tspan
|
||||||
|
id="tspan3445"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003" /></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221"
|
||||||
|
id="text3451"><tspan
|
||||||
|
id="tspan3449"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221">Key up</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0"><tspan
|
||||||
|
id="tspan3449-63"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429">First</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0-1"><tspan
|
||||||
|
id="tspan3449-63-5"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429">2nd</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534-5">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="text3451-0-1-5"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="tspan3534-5-7">End of</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="116.98158"
|
||||||
|
id="tspan3758">Tapping</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="123.68436"
|
||||||
|
id="tspan3760">Term</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244"
|
||||||
|
id="text3451-3"><tspan
|
||||||
|
id="tspan3449-6"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244">Key down</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905"
|
||||||
|
id="text3451-4"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905">on_each_tap(count:1, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851"
|
||||||
|
id="text3451-4-9"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851">on_each_release(count:1, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748"
|
||||||
|
id="text3451-4-7"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-4"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748">on_each_tap(count:2, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="200.44789"
|
||||||
|
y="-67.038536"
|
||||||
|
id="text3451-4-9-5"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="200.44789"
|
||||||
|
y="-67.038536">on_each_release(count:2, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="192.12431"
|
||||||
|
y="-49.462635"
|
||||||
|
id="text3451-4-9-5-4"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2-4"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="192.12431"
|
||||||
|
y="-49.462635">on_dance_finished(count:2, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="203.71626"
|
||||||
|
y="-73.008339"
|
||||||
|
id="text3451-4-9-5-4-0"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2-4-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="203.71626"
|
||||||
|
y="-73.008339">on_reset(count:2, pressed:false)</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.965;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 136.8083,127.93103 -0.0323,8.87583"
|
||||||
|
id="path3722" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 12 KiB |
286
docs/features/tap-dance-doube-tap-interrupted.svg
Normal file
286
docs/features/tap-dance-doube-tap-interrupted.svg
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="226.37836mm"
|
||||||
|
height="202.94032mm"
|
||||||
|
viewBox="0 0 226.37835 202.94033"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||||
|
sodipodi:docname="tap-dance-doube-tap-interrupted.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#111111"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:showpageshadow="0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="1"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.6819304"
|
||||||
|
inkscape:cx="428.6741"
|
||||||
|
inkscape:cy="465.5365"
|
||||||
|
inkscape:current-layer="layer1" />
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="Arrow1L"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
inkscape:stockid="Arrow1L"
|
||||||
|
markerWidth="8.75"
|
||||||
|
markerHeight="5"
|
||||||
|
viewBox="0 0 8.75 5"
|
||||||
|
inkscape:isstock="true"
|
||||||
|
inkscape:collect="always"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
id="arrow1L"
|
||||||
|
transform="scale(-0.5)" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(20.27222,-104.88129)">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.165;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1L)"
|
||||||
|
d="m 12.896004,136.56477 c 1.573387,-0.27013 174.985566,0.43796 174.985566,0.43796"
|
||||||
|
id="path344" />
|
||||||
|
<g
|
||||||
|
id="g3305"
|
||||||
|
transform="translate(0.73059446)">
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 14.389388,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 25.508952,135.91803 -3.156917,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3305-5"
|
||||||
|
transform="translate(35.789927)">
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 14.389388,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611-35"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 25.508952,135.91803 -3.156917,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3-6"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:#ff7f2a;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 89.614624,137.01176 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611-35-8"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312"
|
||||||
|
id="text3393"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3391"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312">Time</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003"
|
||||||
|
id="text3447"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3445"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003" /></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221"
|
||||||
|
id="text3451"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221">Key up</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-63"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429">First</tspan><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0-1"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-63-5"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429">2nd</tspan><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534-5">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="91.764717"
|
||||||
|
y="112.80116"
|
||||||
|
id="text3451-0-1-3"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="91.764717"
|
||||||
|
y="112.80116"
|
||||||
|
id="tspan6210">Other key</tspan><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="91.764717"
|
||||||
|
y="119.50394"
|
||||||
|
id="tspan6214">interrupting</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="text3451-0-1-5"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="tspan3534-5-7">End of</tspan><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="116.98158"
|
||||||
|
id="tspan3758">Tapping</tspan><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="123.68436"
|
||||||
|
id="tspan3760">Term</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244"
|
||||||
|
id="text3451-3"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-6"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244">Key down</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905"
|
||||||
|
id="text3451-4"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905">on_each_tap(count:1, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851"
|
||||||
|
id="text3451-4-9"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-7-3"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851">on_each_release(count:1, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748"
|
||||||
|
id="text3451-4-7"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-7-4"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748">on_each_tap(count:2, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="154.10144"
|
||||||
|
y="16.820175"
|
||||||
|
id="text3451-4-9-5"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-7-3-2"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="154.10144"
|
||||||
|
y="16.820175">on_each_release(count:2, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="171.87991"
|
||||||
|
y="-10.322473"
|
||||||
|
id="text3451-4-9-5-4"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-7-3-2-4"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="171.87991"
|
||||||
|
y="-10.322473">on_dance_finished(count:2, interrupted:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="176.01163"
|
||||||
|
y="-17.869198"
|
||||||
|
id="text3451-4-9-5-4-0"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3449-7-3-2-4-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="176.01163"
|
||||||
|
y="-17.869198">on_reset(count:2, pressed:false)</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.965;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 136.8083,127.93103 -0.0323,8.87583"
|
||||||
|
id="path3722"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 15 KiB |
219
docs/features/tap-dance-doube-tap.svg
Normal file
219
docs/features/tap-dance-doube-tap.svg
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="242.0305mm"
|
||||||
|
height="190.76183mm"
|
||||||
|
viewBox="0 0 242.0305 190.76183"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<marker
|
||||||
|
style="overflow:visible"
|
||||||
|
id="Arrow1L"
|
||||||
|
refX="0"
|
||||||
|
refY="0"
|
||||||
|
orient="auto-start-reverse"
|
||||||
|
markerWidth="8.75"
|
||||||
|
markerHeight="5"
|
||||||
|
viewBox="0 0 8.75 5"
|
||||||
|
preserveAspectRatio="xMidYMid">
|
||||||
|
<path
|
||||||
|
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||||
|
id="arrow1L"
|
||||||
|
transform="scale(-0.5)" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(20.27222,-104.88129)">
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.165;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1L)"
|
||||||
|
d="m 12.896004,136.56477 c 1.573387,-0.27013 174.985566,0.43796 174.985566,0.43796"
|
||||||
|
id="path344" />
|
||||||
|
<g
|
||||||
|
id="g3305"
|
||||||
|
transform="translate(0.73059446)">
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 14.389388,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 25.508952,135.91803 -3.156917,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3305-5"
|
||||||
|
transform="translate(35.789927)">
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 14.389388,137.10256 3.308959,5.51131 3.247063,-5.53223 z"
|
||||||
|
id="path2611-35" />
|
||||||
|
<path
|
||||||
|
style="fill:#00a391;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 25.508952,135.91803 -3.156917,-5.50799 -3.24706,5.53223 z"
|
||||||
|
id="path2611-3-6" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312"
|
||||||
|
id="text3393"><tspan
|
||||||
|
id="tspan3391"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="190.14647"
|
||||||
|
y="134.80312">Time</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003"
|
||||||
|
id="text3447"><tspan
|
||||||
|
id="tspan3445"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-14.746731"
|
||||||
|
y="130.41003" /></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221"
|
||||||
|
id="text3451"><tspan
|
||||||
|
id="tspan3449"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-11.466892"
|
||||||
|
y="132.08221">Key up</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0"><tspan
|
||||||
|
id="tspan3449-63"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="113.79429">First</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="19.694458"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429"
|
||||||
|
id="text3451-0-1"><tspan
|
||||||
|
id="tspan3449-63-5"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="113.79429">2nd</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="54.216129"
|
||||||
|
y="120.49707"
|
||||||
|
id="tspan3534-5">press</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:0.95;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="text3451-0-1-5"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="110.27879"
|
||||||
|
id="tspan3534-5-7">End of</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="116.98158"
|
||||||
|
id="tspan3758">Tapping</tspan><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583"
|
||||||
|
x="137.03003"
|
||||||
|
y="123.68436"
|
||||||
|
id="tspan3760">Term</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244"
|
||||||
|
id="text3451-3"><tspan
|
||||||
|
id="tspan3449-6"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:sans-serif;stroke-width:0.264583"
|
||||||
|
x="-20.95661"
|
||||||
|
y="144.95244">Key down</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905"
|
||||||
|
id="text3451-4"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="134.78493"
|
||||||
|
y="55.269905">on_each_tap(count:1, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851"
|
||||||
|
id="text3451-4-9"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="138.60913"
|
||||||
|
y="48.284851">on_each_release(count:1, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748"
|
||||||
|
id="text3451-4-7"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-4"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="151.62125"
|
||||||
|
y="24.517748">on_each_tap(count:2, pressed:true)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="155.43564"
|
||||||
|
y="17.550631"
|
||||||
|
id="text3451-4-9-5"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="155.43564"
|
||||||
|
y="17.550631">on_each_release(count:2, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="192.12431"
|
||||||
|
y="-49.462635"
|
||||||
|
id="text3451-4-9-5-4"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2-4"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="192.12431"
|
||||||
|
y="-49.462635">on_dance_finished(count:2, pressed:false)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:1.25;font-family:FreeMono;-inkscape-font-specification:FreeMono;font-variant-ligatures:none;stroke-width:0.264583"
|
||||||
|
x="196.15424"
|
||||||
|
y="-56.823414"
|
||||||
|
id="text3451-4-9-5-4-0"
|
||||||
|
transform="rotate(61.3)"><tspan
|
||||||
|
id="tspan3449-7-3-2-4-7"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:FreeMono;-inkscape-font-specification:FreeMono;stroke-width:0.264583"
|
||||||
|
x="196.15424"
|
||||||
|
y="-56.823414">on_reset(count:2, pressed:false)</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1.965;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="m 136.8083,127.93103 -0.0323,8.87583"
|
||||||
|
id="path3722" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 12 KiB |
@ -15,23 +15,26 @@ Optionally, you might want to set a custom `TAPPING_TERM` time by adding somethi
|
|||||||
```c
|
```c
|
||||||
#define TAPPING_TERM 175
|
#define TAPPING_TERM 175
|
||||||
#define TAPPING_TERM_PER_KEY
|
#define TAPPING_TERM_PER_KEY
|
||||||
|
#define TAP_DANCE_MAX_SIMULTANEOUS 3
|
||||||
```
|
```
|
||||||
|
|
||||||
The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead. The `TAPPING_TERM_PER_KEY` definition is only needed if you control the tapping term through a [custom `get_tapping_term` function](../tap_hold#tapping_term), which may be needed because `TAPPING_TERM` affects not just tap-dance keys.
|
The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead. The `TAPPING_TERM_PER_KEY` definition is only needed if you control the tapping term through a [custom `get_tapping_term` function](../tap_hold#tapping_term), which may be needed because `TAPPING_TERM` affects not just tap-dance keys.
|
||||||
|
|
||||||
|
`TAP_DANCE_MAX_SIMULTANEOUS` controls how many tap dance keys can be held at the same time and register keycodes. Increasing this value will use more RAM because each active tap dance needs a significant amount of state in active memory.
|
||||||
|
|
||||||
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro. That macro takes a number which will later be used as an index into the `tap_dance_actions` array and turns it into a tap-dance keycode.
|
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro. That macro takes a number which will later be used as an index into the `tap_dance_actions` array and turns it into a tap-dance keycode.
|
||||||
|
|
||||||
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there several possible options:
|
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there several possible options:
|
||||||
|
|
||||||
* `ACTION_TAP_DANCE_DOUBLE(pair)`: Define keycode pairs in a separate progmem array. With the pair `{kc1, kc2}`, it sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
|
* `ACTION_TAP_DANCE_DOUBLE(pair)`: Define keycode pairs in a separate `PROGMEM` array. With the pair `{kc1, kc2}`, it sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
|
||||||
* `ACTION_TAP_DANCE_DUAL_ROLE(dual_role)`: Define dual roles in a separate progmem array. Using the following:
|
* `ACTION_TAP_DANCE_DUAL_ROLE(dual_role)`: Define dual roles in a separate `PROGMEM` array. Using the following:
|
||||||
* `DUAL_ROLE_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
|
* `DUAL_ROLE_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
|
||||||
* `DUAL_ROLE_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
|
* `DUAL_ROLE_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
|
||||||
* `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(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 when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
|
* `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 when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
|
||||||
* `ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(on_each_tap_fn, on_each_release_fn, on_dance_finished_fn, on_dance_reset_fn)`: This macro is identical to `ACTION_TAP_DANCE_FN_ADVANCED` with the addition of `on_each_release_fn` which is invoked every time the key for the tap dance is released. It is worth noting that `on_each_release_fn` will still be called even when the key is released after the dance finishes (e.g. if the key is released after being pressed and held for longer than the `TAPPING_TERM`).
|
* `ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(on_each_tap_fn, on_each_release_fn, on_dance_finished_fn, on_dance_reset_fn)`: This macro is identical to `ACTION_TAP_DANCE_FN_ADVANCED` with the addition of `on_each_release_fn` which is invoked every time the key for the tap dance is released. It is worth noting that `on_each_release_fn` will still be called even when the key is released after the dance finishes (e.g. if the key is released after being pressed and held for longer than the `TAPPING_TERM`).
|
||||||
|
|
||||||
The first option is enough for a lot of cases that just want dual roles.
|
The first option is enough for a lot of cases that just want keys that do something different when double tapped.
|
||||||
|
|
||||||
::: warning
|
::: warning
|
||||||
Keep in mind that only [basic keycodes](../keycodes_basic) are supported here. Custom keycodes are not supported.
|
Keep in mind that only [basic keycodes](../keycodes_basic) are supported here. Custom keycodes are not supported.
|
||||||
@ -41,12 +44,50 @@ Similar to the first option, the second and third option are good for simple lay
|
|||||||
|
|
||||||
For more complicated cases, like blink the LEDs, fiddle with the backlighting, and so on, use the fourth or fifth option. Examples of each are listed below.
|
For more complicated cases, like blink the LEDs, fiddle with the backlighting, and so on, use the fourth or fifth option. Examples of each are listed below.
|
||||||
|
|
||||||
|
## Custom tap dances {#custom}
|
||||||
|
|
||||||
|
There are four callback functions that can be used when implementing custom tap dances:
|
||||||
|
|
||||||
|
- `on_each_tap(tap_dance_state_t *state, void *user_data)`;
|
||||||
|
- `on_dance_finished(tap_dance_state_t *state, void *user_data)`;
|
||||||
|
- `on_reset(tap_dance_state_t *state, void *user_data)`;
|
||||||
|
- `on_each_release(tap_dance_state_t *state, void *user_data)`;
|
||||||
|
|
||||||
|
Here are some illustrations of when those functions are called during tap dances:
|
||||||
|
|
||||||
|
### Double tap
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### Interrupted double tap
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### Double hold
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### Interrupted double hold
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Skipping the finished callback
|
||||||
|
|
||||||
|
It is possible to end a tap dance immediately, skipping `on_dance_finished()`, but not `on_dance_reset_fn`, by calling `reset_tap_dance(state)`. Use this if your tap dance code has completely handled the tap dance in an earlier callback and the logic in the finished callback should not get executed.
|
||||||
|
|
||||||
|
### Configuration data
|
||||||
|
|
||||||
|
Your custom tap dance functions can accept `user_data` with configuration. This may consist of key codes, method pointers, or boolean flags used by your custom logic. So that it doesn't constantly take up RAM, it should be marked as PROGMEM. `memcpy_P()` should be used to read the `user_data` pointer into working memory in each of your callbacks. See [example 3](#example-3) below.
|
||||||
|
|
||||||
|
### Mutable state
|
||||||
|
|
||||||
|
Your custom tap dance may need to store data about the state of the current dance. Because `user_data` should be kept in immutable flash memory, it is not appropriate to use it for mutable state. Instead, define a static array of your state of size `TAP_DANCE_MAX_SIMULTANEOUS`. From the callback functions, use `state->state_idx` to get the index into this array which should be used. See [example 3](#example-3) below.
|
||||||
|
|
||||||
## Implementation Details {#implementation}
|
## Implementation Details {#implementation}
|
||||||
|
|
||||||
Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works!
|
|
||||||
|
|
||||||
Let's go over the three functions mentioned in `ACTION_TAP_DANCE_FN_ADVANCED` in a little more detail. They all receive the same two arguments: a pointer to a structure that holds all dance related state information, and a pointer to a use case specific state variable. The three functions differ in when they are called. The first, `on_each_tap_fn()`, is called every time the tap dance key is *pressed*. Before it is called, the counter is incremented and the timer is reset. The second function, `on_dance_finished_fn()`, is called when the tap dance is interrupted or ends because `TAPPING_TERM` milliseconds have passed since the last tap. When the `finished` field of the dance state structure is set to `true`, the `on_dance_finished_fn()` is skipped. After `on_dance_finished_fn()` was called or would have been called, but no sooner than when the tap dance key is *released*, `on_dance_reset_fn()` is called. It is possible to end a tap dance immediately, skipping `on_dance_finished_fn()`, but not `on_dance_reset_fn`, by calling `reset_tap_dance(state)`.
|
|
||||||
|
|
||||||
To accomplish this logic, the tap dance mechanics use three entry points. The main entry point is `process_tap_dance()`, called from `process_record_quantum()` *after* `process_record_kb()` and `process_record_user()`. This function is responsible for calling `on_each_tap_fn()` and `on_dance_reset_fn()`. In order to handle interruptions of a tap dance, another entry point, `preprocess_tap_dance()` is run right at the beginning of `process_record_quantum()`. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. Finally, `tap_dance_task()` periodically checks whether `TAPPING_TERM` has passed since the last key press and finishes a tap dance if that is the case.
|
To accomplish this logic, the tap dance mechanics use three entry points. The main entry point is `process_tap_dance()`, called from `process_record_quantum()` *after* `process_record_kb()` and `process_record_user()`. This function is responsible for calling `on_each_tap_fn()` and `on_dance_reset_fn()`. In order to handle interruptions of a tap dance, another entry point, `preprocess_tap_dance()` is run right at the beginning of `process_record_quantum()`. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. Finally, `tap_dance_task()` periodically checks whether `TAPPING_TERM` has passed since the last key press and finishes a tap dance if that is the case.
|
||||||
|
|
||||||
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
|
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
|
||||||
@ -61,7 +102,7 @@ Here's a simple example for a single definition:
|
|||||||
2. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
|
2. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// Tap dance pair declarations
|
// Enumerate all tap dance pairs
|
||||||
enum {
|
enum {
|
||||||
P_ESC_CAPS,
|
P_ESC_CAPS,
|
||||||
};
|
};
|
||||||
@ -71,7 +112,7 @@ const tap_dance_pair_t tap_dance_pairs[] PROGMEM = {
|
|||||||
[P_ESC_CAPS] = {KC_ESC, KC_CAPS},
|
[P_ESC_CAPS] = {KC_ESC, KC_CAPS},
|
||||||
};
|
};
|
||||||
|
|
||||||
// Tap dance declarations
|
// Enumerate all tap dances
|
||||||
enum {
|
enum {
|
||||||
TD_ESC_CAPS,
|
TD_ESC_CAPS,
|
||||||
};
|
};
|
||||||
@ -186,6 +227,23 @@ typedef struct {
|
|||||||
|
|
||||||
static tap_dance_tap_hold_state_t tap_dance_tap_hold_states[TAP_DANCE_MAX_SIMULTANEOUS];
|
static tap_dance_tap_hold_state_t tap_dance_tap_hold_states[TAP_DANCE_MAX_SIMULTANEOUS];
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
tap_dance_action_t *action;
|
||||||
|
tap_dance_state_t* state;
|
||||||
|
tap_dance_tap_hold_t tap_hold;
|
||||||
|
|
||||||
|
switch (keycode) {
|
||||||
|
case TD(CT_CLN):
|
||||||
|
action = tap_dance_get(QK_TAP_DANCE_GET_INDEX(keycode));
|
||||||
|
state = tap_dance_get_state(QK_TAP_DANCE_GET_INDEX(keycode));
|
||||||
|
if (!record->event.pressed && state != NULL && state->count && !state->finished) {
|
||||||
|
memcpy_P(&tap_hold, (tap_dance_tap_hold_t *)action->user_data, sizeof(tap_dance_tap_hold_t));
|
||||||
|
tap_code16(tap_hold.tap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void tap_dance_tap_hold_finished(tap_dance_state_t *state, void *user_data) {
|
void tap_dance_tap_hold_finished(tap_dance_state_t *state, void *user_data) {
|
||||||
tap_dance_tap_hold_t tap_hold;
|
tap_dance_tap_hold_t tap_hold;
|
||||||
memcpy_P(&tap_hold, user_data, sizeof(tap_dance_tap_hold_t));
|
memcpy_P(&tap_hold, user_data, sizeof(tap_dance_tap_hold_t));
|
||||||
@ -217,10 +275,17 @@ void tap_dance_tap_hold_reset(tap_dance_state_t *state, void *user_data) {
|
|||||||
|
|
||||||
#define ACTION_TAP_DANCE_TAP_HOLD(tap_hold) {{NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, (void *)&(tap_hold)}
|
#define ACTION_TAP_DANCE_TAP_HOLD(tap_hold) {{NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, (void *)&(tap_hold)}
|
||||||
|
|
||||||
const tap_dance_tap_hold_t d_ct_cln PROGMEM = {KC_COLN, KC_SCLN};
|
enum {
|
||||||
|
TH_CT_CLN,
|
||||||
|
};
|
||||||
|
|
||||||
|
const tap_dance_tap_hold_t tap_dance_tap_holds[] PROGMEM = {
|
||||||
|
[TH_CT_CLN] = {KC_COLN, KC_SCLN},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const tap_dance_action_t tap_dance_actions[] PROGMEM = {
|
const tap_dance_action_t tap_dance_actions[] PROGMEM = {
|
||||||
[CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(d_ct_cln),
|
[CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(tap_dance_tap_holds[TH_CT_CLN]),
|
||||||
};
|
};
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
@ -132,7 +132,13 @@ void tap_dance_tap_hold_reset(tap_dance_state_t *state, void *user_data) {
|
|||||||
|
|
||||||
#define ACTION_TAP_DANCE_TAP_HOLD(tap_hold) {{NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, (void *)&(tap_hold)}
|
#define ACTION_TAP_DANCE_TAP_HOLD(tap_hold) {{NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, (void *)&(tap_hold)}
|
||||||
|
|
||||||
const tap_dance_tap_hold_t d_ct_cln PROGMEM = {KC_COLN, KC_SCLN};
|
enum {
|
||||||
|
TH_CT_CLN,
|
||||||
|
};
|
||||||
|
|
||||||
|
const tap_dance_tap_hold_t tap_dance_tap_holds[] PROGMEM = {
|
||||||
|
[TH_CT_CLN] = {KC_COLN, KC_SCLN},
|
||||||
|
};
|
||||||
|
|
||||||
// Example 4
|
// Example 4
|
||||||
|
|
||||||
@ -225,7 +231,7 @@ const tap_dance_action_t tap_dance_actions[] PROGMEM = {
|
|||||||
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(p_esc_caps),
|
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(p_esc_caps),
|
||||||
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
|
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
|
||||||
[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset),
|
[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset),
|
||||||
[CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(d_ct_cln),
|
[CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(tap_dance_tap_holds[TH_CT_CLN]),
|
||||||
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset),
|
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset),
|
||||||
[TD_RELEASE] = ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(release_press, release_unpress, release_finished, release_reset),
|
[TD_RELEASE] = ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(release_press, release_unpress, release_finished, release_reset),
|
||||||
[TD_RELEASE_AND_FINISH] = ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(release_press, release_unpress_mark_finished, release_finished, release_reset),
|
[TD_RELEASE_AND_FINISH] = ACTION_TAP_DANCE_FN_ADVANCED_WITH_RELEASE(release_press, release_unpress_mark_finished, release_finished, release_reset),
|
||||||
|
Loading…
Reference in New Issue
Block a user