diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2018-05-21 12:19:30 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2018-05-21 12:19:30 +1000 |
commit | 2167c3af058aebf5ce732ed0a3a1c5488b2a9d73 (patch) | |
tree | 2393db3b06a6f33884c646899eb922de7ad7adcd | |
parent | fbd284ec144fee52d9cd2a2cc2d3ddcb0c160e32 (diff) | |
parent | 33162632cb51e32851100013536f8566a68e0667 (diff) |
Merge branch 'wip/custom-pointer-accel-revert'
-rw-r--r-- | doc/pointer-acceleration.dox | 66 | ||||
-rw-r--r-- | doc/svg/ptraccel-curve-example.svg | 290 | ||||
-rw-r--r-- | meson.build | 1 | ||||
-rw-r--r-- | src/evdev-mt-touchpad.c | 29 | ||||
-rw-r--r-- | src/evdev.c | 29 | ||||
-rw-r--r-- | src/filter-custom.c | 216 | ||||
-rw-r--r-- | src/filter-private.h | 2 | ||||
-rw-r--r-- | src/filter.c | 9 | ||||
-rw-r--r-- | src/filter.h | 12 | ||||
-rw-r--r-- | src/libinput-private.h | 2 | ||||
-rw-r--r-- | src/libinput.c | 14 | ||||
-rw-r--r-- | src/libinput.h | 56 | ||||
-rw-r--r-- | src/libinput.sym | 1 | ||||
-rw-r--r-- | test/test-pointer.c | 52 | ||||
-rw-r--r-- | tools/libinput-debug-events.man | 10 | ||||
-rw-r--r-- | tools/libinput-list-devices.c | 6 | ||||
-rw-r--r-- | tools/ptraccel-debug.c | 29 | ||||
-rw-r--r-- | tools/shared.c | 21 | ||||
-rw-r--r-- | tools/shared.h | 7 |
19 files changed, 57 insertions, 795 deletions
diff --git a/doc/pointer-acceleration.dox b/doc/pointer-acceleration.dox index 5e300998..652c72c6 100644 --- a/doc/pointer-acceleration.dox +++ b/doc/pointer-acceleration.dox @@ -153,70 +153,4 @@ Pointer acceleration for relative motion on tablet devices is a flat acceleration, with the speed setting slowing down or speeding up the pointer motion by a constant factor. Tablets do not allow for switchable profiles. -@section ptraccel-device-speed Speed-dependent acceleration curve - -When the @ref LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE profile is -selected, it is the caller's responsibility to load an acceleration profile -into the device that maps the device's movement into an accelerated -movement. - -This profile maps input speed in **device units** to an acceleration -factor. libinput calculates the device's speed based on the deltas and their -timestamps and applies the factor provided by the acceleration profile to -the current delta. - -@note This profile uses data in device units, an acceleration curve loaded -by the caller only applies to that device and will not behave the same way -for other devices. - -@dot -digraph -{ - rankdir="LR"; - node [shape="box";] - subgraph cluster0 { - history[shape=record,label="<f0> delta(t-1)|<f1> delta(t-2)|<f2> delta(t-3)| <f3> ..."]; - label = "motion history"; - } - delta[label="delta"]; - velocity[shape="ellipse"]; - factor[shape="ellipse"]; - accel[label="accelerated delta"]; - curve[label="acceleration curve"]; - - delta->velocity; - delta->factor; - factor->accel; - history->velocity; - - velocity->curve; - curve->factor; -} -@enddot - -For example, assume the current delta is (2, 4) which maps to a current -movement velocity of 10 units per microsecond. libinput looks up the custom -acceleration function for 10 which may return 3. The accelerated delta thus -becomes (6, 12). - -The profile itself is a curve defined by a number of points on the curve -mapping speed to an acceleration factor. Between each two curve points, -libinput provides linear interpolation, most acceleration profiles will thus -only need to provide a handful of curve points. The following illustration -shows the acceleration curve defined for the points (10, 0.25), (20, 0.4) -and (35, 3.0). - -@image html ptraccel-curve-example.svg "Interpolation of the acceleration curve for three defined points" - -As seen in the picture above: given an acceleration factor f(x) and a curve -defined by the caller for the points -a, b, and c where a < b < c: -- if x <= a, f(x) == f(a) -- if x >= c, f(x) == f(c) -- if a < x < b: f(x) == the the linear interpolation value between f(a) and f(b) -- if b < x < c: f(x) == the the linear interpolation value between f(b) and f(c) - -The behavior of a a curve is implementation-defined until the caller sets -curve points. - */ diff --git a/doc/svg/ptraccel-curve-example.svg b/doc/svg/ptraccel-curve-example.svg deleted file mode 100644 index b098e142..00000000 --- a/doc/svg/ptraccel-curve-example.svg +++ /dev/null @@ -1,290 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="no"?> -<svg - width="600" height="480" - viewBox="0 0 600 480" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" -> - -<title>Gnuplot</title> -<desc>Produced by GNUPLOT 5.0 patchlevel 6 </desc> - -<g id="gnuplot_canvas"> - -<rect x="0" y="0" width="600" height="480" fill="none"/> -<defs> - - <circle id='gpDot' r='0.5' stroke-width='0.5'/> - <path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/> - <path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/> - <path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/> - <rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/> - <rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/> - <circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/> - <use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/> - <path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/> - <use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/> - <use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/> - <use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/> - <use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/> - <use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/> - <path id='gpPt13' stroke-width='0.222' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/> - <use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/> - <filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'> - <feFlood flood-color='white' flood-opacity='1' result='bgnd'/> - <feComposite in='SourceGraphic' in2='bgnd' operator='atop'/> - </filter> - <filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'> - <feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/> - <feComposite in='SourceGraphic' in2='grey' operator='atop'/> - </filter> -</defs> -<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '/> <g transform="translate(63.6,426.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 0</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,364.4 L80.9,364.4 M575.0,364.4 L566.0,364.4 '/> <g transform="translate(63.6,368.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 0.5</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,306.5 L80.9,306.5 M575.0,306.5 L566.0,306.5 '/> <g transform="translate(63.6,310.4)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 1</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,248.5 L80.9,248.5 M575.0,248.5 L566.0,248.5 '/> <g transform="translate(63.6,252.4)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 1.5</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,190.6 L80.9,190.6 M575.0,190.6 L566.0,190.6 '/> <g transform="translate(63.6,194.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 2</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,132.6 L80.9,132.6 M575.0,132.6 L566.0,132.6 '/> <g transform="translate(63.6,136.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 2.5</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,74.7 L80.9,74.7 M575.0,74.7 L566.0,74.7 '/> <g transform="translate(63.6,78.6)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 3</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '/> <g transform="translate(63.6,20.6)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" > 3.5</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '/> <g transform="translate(71.9,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 0</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M134.8,422.4 L134.8,413.4 M134.8,16.7 L134.8,25.7 '/> <g transform="translate(134.8,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 5</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M197.7,422.4 L197.7,413.4 M197.7,16.7 L197.7,25.7 '/> <g transform="translate(197.7,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 10</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M260.6,422.4 L260.6,413.4 M260.6,16.7 L260.6,25.7 '/> <g transform="translate(260.6,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 15</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M323.5,422.4 L323.5,413.4 M323.5,16.7 L323.5,25.7 '/> <g transform="translate(323.5,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 20</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M386.3,422.4 L386.3,413.4 M386.3,16.7 L386.3,25.7 '/> <g transform="translate(386.3,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 25</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M449.2,422.4 L449.2,413.4 M449.2,16.7 L449.2,25.7 '/> <g transform="translate(449.2,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 30</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M512.1,422.4 L512.1,413.4 M512.1,16.7 L512.1,25.7 '/> <g transform="translate(512.1,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 35</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '/> <g transform="translate(575.0,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" > 40</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '/></g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <g transform="translate(17.0,219.6) rotate(270)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" >acceleration factor</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <g transform="translate(323.4,471.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="middle"> - <text><tspan font-family="Arial" >speed (device units/ms)</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> -</g> - <g id="gnuplot_plot_1" ><title>factor</title> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <g transform="translate(507.9,38.6)" stroke="none" fill="black" font-family="Arial" font-size="12.00" text-anchor="end"> - <text><tspan font-family="Arial" >factor</tspan></text> - </g> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='rgb(148, 0, 211)' d='M516.2,34.7 L558.4,34.7 M71.9,393.4 L72.4,393.4 L72.9,393.4 L73.4,393.4 L73.9,393.4 L74.4,393.4 - L74.9,393.4 L75.4,393.4 L75.9,393.4 L76.4,393.4 L76.9,393.4 L77.3,393.4 L77.8,393.4 L78.3,393.4 - L78.8,393.4 L79.3,393.4 L79.8,393.4 L80.3,393.4 L80.8,393.4 L81.3,393.4 L81.8,393.4 L82.3,393.4 - L82.8,393.4 L83.3,393.4 L83.8,393.4 L84.3,393.4 L84.8,393.4 L85.3,393.4 L85.8,393.4 L86.3,393.4 - L86.8,393.4 L87.3,393.4 L87.7,393.4 L88.2,393.4 L88.7,393.4 L89.2,393.4 L89.7,393.4 L90.2,393.4 - L90.7,393.4 L91.2,393.4 L91.7,393.4 L92.2,393.4 L92.7,393.4 L93.2,393.4 L93.7,393.4 L94.2,393.4 - L94.7,393.4 L95.2,393.4 L95.7,393.4 L96.2,393.4 L96.7,393.4 L97.2,393.4 L97.6,393.4 L98.1,393.4 - L98.6,393.4 L99.1,393.4 L99.6,393.4 L100.1,393.4 L100.6,393.4 L101.1,393.4 L101.6,393.4 L102.1,393.4 - L102.6,393.4 L103.1,393.4 L103.6,393.4 L104.1,393.4 L104.6,393.4 L105.1,393.4 L105.6,393.4 L106.1,393.4 - L106.6,393.4 L107.1,393.4 L107.6,393.4 L108.0,393.4 L108.5,393.4 L109.0,393.4 L109.5,393.4 L110.0,393.4 - L110.5,393.4 L111.0,393.4 L111.5,393.4 L112.0,393.4 L112.5,393.4 L113.0,393.4 L113.5,393.4 L114.0,393.4 - L114.5,393.4 L115.0,393.4 L115.5,393.4 L116.0,393.4 L116.5,393.4 L117.0,393.4 L117.5,393.4 L118.0,393.4 - L118.4,393.4 L118.9,393.4 L119.4,393.4 L119.9,393.4 L120.4,393.4 L120.9,393.4 L121.4,393.4 L121.9,393.4 - L122.4,393.4 L122.9,393.4 L123.4,393.4 L123.9,393.4 L124.4,393.4 L124.9,393.4 L125.4,393.4 L125.9,393.4 - L126.4,393.4 L126.9,393.4 L127.4,393.4 L127.9,393.4 L128.4,393.4 L128.8,393.4 L129.3,393.4 L129.8,393.4 - L130.3,393.4 L130.8,393.4 L131.3,393.4 L131.8,393.4 L132.3,393.4 L132.8,393.4 L133.3,393.4 L133.8,393.4 - L134.3,393.4 L134.8,393.4 L135.3,393.4 L135.8,393.4 L136.3,393.4 L136.8,393.4 L137.3,393.4 L137.8,393.4 - L138.3,393.4 L138.7,393.4 L139.2,393.4 L139.7,393.4 L140.2,393.4 L140.7,393.4 L141.2,393.4 L141.7,393.4 - L142.2,393.4 L142.7,393.4 L143.2,393.4 L143.7,393.4 L144.2,393.4 L144.7,393.4 L145.2,393.4 L145.7,393.4 - L146.2,393.4 L146.7,393.4 L147.2,393.4 L147.7,393.4 L148.2,393.4 L148.7,393.4 L149.1,393.4 L149.6,393.4 - L150.1,393.4 L150.6,393.4 L151.1,393.4 L151.6,393.4 L152.1,393.4 L152.6,393.4 L153.1,393.4 L153.6,393.4 - L154.1,393.4 L154.6,393.4 L155.1,393.4 L155.6,393.4 L156.1,393.4 L156.6,393.4 L157.1,393.4 L157.6,393.4 - L158.1,393.4 L158.6,393.4 L159.1,393.4 L159.5,393.4 L160.0,393.4 L160.5,393.4 L161.0,393.4 L161.5,393.4 - L162.0,393.4 L162.5,393.4 L163.0,393.4 L163.5,393.4 L164.0,393.4 L164.5,393.4 L165.0,393.4 L165.5,393.4 - L166.0,393.4 L166.5,393.4 L167.0,393.4 L167.5,393.4 L168.0,393.4 L168.5,393.4 L169.0,393.4 L169.4,393.4 - L169.9,393.4 L170.4,393.4 L170.9,393.4 L171.4,393.4 L171.9,393.4 L172.4,393.4 L172.9,393.4 L173.4,393.4 - L173.9,393.4 L174.4,393.4 L174.9,393.4 L175.4,393.4 L175.9,393.4 L176.4,393.4 L176.9,393.4 L177.4,393.4 - L177.9,393.4 L178.4,393.4 L178.9,393.4 L179.4,393.4 L179.8,393.4 L180.3,393.4 L180.8,393.4 L181.3,393.4 - L181.8,393.4 L182.3,393.4 L182.8,393.4 L183.3,393.4 L183.8,393.4 L184.3,393.4 L184.8,393.4 L185.3,393.4 - L185.8,393.4 L186.3,393.4 L186.8,393.4 L187.3,393.4 L187.8,393.4 L188.3,393.4 L188.8,393.4 L189.3,393.4 - L189.8,393.4 L190.2,393.4 L190.7,393.4 L191.2,393.4 L191.7,393.4 L192.2,393.4 L192.7,393.4 L193.2,393.4 - L193.7,393.4 L194.2,393.4 L194.7,393.4 L195.2,393.4 L195.7,393.4 L196.2,393.4 L196.7,393.4 L197.2,393.4 - L197.7,393.4 L198.2,393.4 L198.7,393.3 L199.2,393.2 L199.7,393.1 L200.2,393.1 L200.6,393.0 L201.1,392.9 - L201.6,392.9 L202.1,392.8 L202.6,392.7 L203.1,392.7 L203.6,392.6 L204.1,392.5 L204.6,392.5 L205.1,392.4 - L205.6,392.3 L206.1,392.3 L206.6,392.2 L207.1,392.1 L207.6,392.1 L208.1,392.0 L208.6,391.9 L209.1,391.8 - L209.6,391.8 L210.1,391.7 L210.5,391.6 L211.0,391.6 L211.5,391.5 L212.0,391.4 L212.5,391.4 L213.0,391.3 - L213.5,391.2 L214.0,391.2 L214.5,391.1 L215.0,391.0 L215.5,391.0 L216.0,390.9 L216.5,390.8 L217.0,390.8 - L217.5,390.7 L218.0,390.6 L218.5,390.5 L219.0,390.5 L219.5,390.4 L220.0,390.3 L220.5,390.3 L220.9,390.2 - L221.4,390.1 L221.9,390.1 L222.4,390.0 L222.9,389.9 L223.4,389.9 L223.9,389.8 L224.4,389.7 L224.9,389.7 - L225.4,389.6 L225.9,389.5 L226.4,389.4 L226.9,389.4 L227.4,389.3 L227.9,389.2 L228.4,389.2 L228.9,389.1 - L229.4,389.0 L229.9,389.0 L230.4,388.9 L230.9,388.8 L231.3,388.8 L231.8,388.7 L232.3,388.6 L232.8,388.6 - L233.3,388.5 L233.8,388.4 L234.3,388.4 L234.8,388.3 L235.3,388.2 L235.8,388.1 L236.3,388.1 L236.8,388.0 - L237.3,388.0 L237.8,387.9 L238.3,387.8 L238.8,387.7 L239.3,387.7 L239.8,387.6 L240.3,387.5 L240.8,387.5 - L241.3,387.4 L241.7,387.3 L242.2,387.3 L242.7,387.2 L243.2,387.1 L243.7,387.1 L244.2,387.0 L244.7,386.9 - L245.2,386.8 L245.7,386.8 L246.2,386.7 L246.7,386.6 L247.2,386.6 L247.7,386.5 L248.2,386.4 L248.7,386.4 - L249.2,386.3 L249.7,386.2 L250.2,386.2 L250.7,386.1 L251.2,386.0 L251.6,386.0 L252.1,385.9 L252.6,385.8 - L253.1,385.8 L253.6,385.7 L254.1,385.6 L254.6,385.6 L255.1,385.5 L255.6,385.4 L256.1,385.3 L256.6,385.3 - L257.1,385.2 L257.6,385.1 L258.1,385.1 L258.6,385.0 L259.1,384.9 L259.6,384.9 L260.1,384.8 L260.6,384.7 - L261.1,384.7 L261.6,384.6 L262.0,384.5 L262.5,384.4 L263.0,384.4 L263.5,384.3 L264.0,384.3 L264.5,384.2 - L265.0,384.1 L265.5,384.0 L266.0,384.0 L266.5,383.9 L267.0,383.8 L267.5,383.8 L268.0,383.7 L268.5,383.6 - L269.0,383.6 L269.5,383.5 L270.0,383.4 L270.5,383.4 L271.0,383.3 L271.5,383.2 L272.0,383.2 L272.4,383.1 - L272.9,383.0 L273.4,382.9 L273.9,382.9 L274.4,382.8 L274.9,382.7 L275.4,382.7 L275.9,382.6 L276.4,382.5 - L276.9,382.5 L277.4,382.4 L277.9,382.3 L278.4,382.3 L278.9,382.2 L279.4,382.1 L279.9,382.1 L280.4,382.0 - L280.9,381.9 L281.4,381.9 L281.9,381.8 L282.4,381.7 L282.8,381.6 L283.3,381.6 L283.8,381.5 L284.3,381.4 - L284.8,381.4 L285.3,381.3 L285.8,381.2 L286.3,381.2 L286.8,381.1 L287.3,381.0 L287.8,381.0 L288.3,380.9 - L288.8,380.8 L289.3,380.8 L289.8,380.7 L290.3,380.6 L290.8,380.6 L291.3,380.5 L291.8,380.4 L292.3,380.3 - L292.7,380.3 L293.2,380.2 L293.7,380.1 L294.2,380.1 L294.7,380.0 L295.2,379.9 L295.7,379.9 L296.2,379.8 - L296.7,379.7 L297.2,379.7 L297.7,379.6 L298.2,379.5 L298.7,379.5 L299.2,379.4 L299.7,379.3 L300.2,379.3 - L300.7,379.2 L301.2,379.1 L301.7,379.0 L302.2,379.0 L302.7,378.9 L303.1,378.8 L303.6,378.8 L304.1,378.7 - L304.6,378.6 L305.1,378.6 L305.6,378.5 L306.1,378.4 L306.6,378.4 L307.1,378.3 L307.6,378.2 L308.1,378.2 - L308.6,378.1 L309.1,378.0 L309.6,377.9 L310.1,377.9 L310.6,377.8 L311.1,377.7 L311.6,377.7 L312.1,377.6 - L312.6,377.5 L313.1,377.5 L313.5,377.4 L314.0,377.3 L314.5,377.3 L315.0,377.2 L315.5,377.1 L316.0,377.1 - L316.5,377.0 L317.0,376.9 L317.5,376.9 L318.0,376.8 L318.5,376.7 L319.0,376.6 L319.5,376.6 L320.0,376.5 - L320.5,376.4 L321.0,376.4 L321.5,376.3 L322.0,376.2 L322.5,376.2 L323.0,376.1 L323.5,376.0 L323.9,375.2 - L324.4,374.5 L324.9,373.7 L325.4,372.9 L325.9,372.1 L326.4,371.3 L326.9,370.5 L327.4,369.7 L327.9,368.9 - L328.4,368.1 L328.9,367.3 L329.4,366.5 L329.9,365.8 L330.4,365.0 L330.9,364.2 L331.4,363.4 L331.9,362.6 - L332.4,361.8 L332.9,361.0 L333.4,360.2 L333.8,359.4 L334.3,358.6 L334.8,357.8 L335.3,357.0 L335.8,356.3 - L336.3,355.5 L336.8,354.7 L337.3,353.9 L337.8,353.1 L338.3,352.3 L338.8,351.5 L339.3,350.7 L339.8,349.9 - L340.3,349.1 L340.8,348.4 L341.3,347.6 L341.8,346.8 L342.3,346.0 L342.8,345.2 L343.3,344.4 L343.8,343.6 - L344.2,342.8 L344.7,342.0 L345.2,341.2 L345.7,340.4 L346.2,339.6 L346.7,338.9 L347.2,338.1 L347.7,337.3 - L348.2,336.5 L348.7,335.7 L349.2,334.9 L349.7,334.1 L350.2,333.3 L350.7,332.5 L351.2,331.7 L351.7,330.9 - L352.2,330.2 L352.7,329.4 L353.2,328.6 L353.7,327.8 L354.2,327.0 L354.6,326.2 L355.1,325.4 L355.6,324.6 - L356.1,323.8 L356.6,323.0 L357.1,322.3 L357.6,321.5 L358.1,320.7 L358.6,319.9 L359.1,319.1 L359.6,318.3 - L360.1,317.5 L360.6,316.7 L361.1,315.9 L361.6,315.1 L362.1,314.3 L362.6,313.5 L363.1,312.8 L363.6,312.0 - L364.1,311.2 L364.5,310.4 L365.0,309.6 L365.5,308.8 L366.0,308.0 L366.5,307.2 L367.0,306.4 L367.5,305.6 - L368.0,304.8 L368.5,304.1 L369.0,303.3 L369.5,302.5 L370.0,301.7 L370.5,300.9 L371.0,300.1 L371.5,299.3 - L372.0,298.5 L372.5,297.7 L373.0,296.9 L373.5,296.1 L374.0,295.3 L374.5,294.6 L374.9,293.8 L375.4,293.0 - L375.9,292.2 L376.4,291.4 L376.9,290.6 L377.4,289.8 L377.9,289.0 L378.4,288.2 L378.9,287.4 L379.4,286.7 - L379.9,285.9 L380.4,285.1 L380.9,284.3 L381.4,283.5 L381.9,282.7 L382.4,281.9 L382.9,281.1 L383.4,280.3 - L383.9,279.5 L384.4,278.7 L384.9,277.9 L385.3,277.2 L385.8,276.4 L386.3,275.6 L386.8,274.8 L387.3,274.0 - L387.8,273.2 L388.3,272.4 L388.8,271.6 L389.3,270.8 L389.8,270.0 L390.3,269.2 L390.8,268.5 L391.3,267.7 - L391.8,266.9 L392.3,266.1 L392.8,265.3 L393.3,264.5 L393.8,263.7 L394.3,262.9 L394.8,262.1 L395.3,261.3 - L395.7,260.5 L396.2,259.8 L396.7,259.0 L397.2,258.2 L397.7,257.4 L398.2,256.6 L398.7,255.8 L399.2,255.0 - L399.7,254.2 L400.2,253.4 L400.7,252.6 L401.2,251.8 L401.7,251.1 L402.2,250.3 L402.7,249.5 L403.2,248.7 - L403.7,247.9 L404.2,247.1 L404.7,246.3 L405.2,245.5 L405.6,244.7 L406.1,243.9 L406.6,243.1 L407.1,242.4 - L407.6,241.6 L408.1,240.8 L408.6,240.0 L409.1,239.2 L409.6,238.4 L410.1,237.6 L410.6,236.8 L411.1,236.0 - L411.6,235.2 L412.1,234.4 L412.6,233.7 L413.1,232.9 L413.6,232.1 L414.1,231.3 L414.6,230.5 L415.1,229.7 - L415.6,228.9 L416.0,228.1 L416.5,227.3 L417.0,226.5 L417.5,225.7 L418.0,225.0 L418.5,224.2 L419.0,223.4 - L419.5,222.6 L420.0,221.8 L420.5,221.0 L421.0,220.2 L421.5,219.4 L422.0,218.6 L422.5,217.8 L423.0,217.0 - L423.5,216.2 L424.0,215.5 L424.5,214.7 L425.0,213.9 L425.5,213.1 L426.0,212.3 L426.4,211.5 L426.9,210.7 - L427.4,209.9 L427.9,209.1 L428.4,208.3 L428.9,207.6 L429.4,206.8 L429.9,206.0 L430.4,205.2 L430.9,204.4 - L431.4,203.6 L431.9,202.8 L432.4,202.0 L432.9,201.2 L433.4,200.4 L433.9,199.6 L434.4,198.8 L434.9,198.1 - L435.4,197.3 L435.9,196.5 L436.4,195.7 L436.8,194.9 L437.3,194.1 L437.8,193.3 L438.3,192.5 L438.8,191.7 - L439.3,190.9 L439.8,190.1 L440.3,189.4 L440.8,188.6 L441.3,187.8 L441.8,187.0 L442.3,186.2 L442.8,185.4 - L443.3,184.6 L443.8,183.8 L444.3,183.0 L444.8,182.2 L445.3,181.4 L445.8,180.6 L446.3,179.9 L446.7,179.1 - L447.2,178.3 L447.7,177.5 L448.2,176.7 L448.7,175.9 L449.2,175.1 L449.7,174.3 L450.2,173.5 L450.7,172.7 - L451.2,172.0 L451.7,171.2 L452.2,170.4 L452.7,169.6 L453.2,168.8 L453.7,168.0 L454.2,167.2 L454.7,166.4 - L455.2,165.6 L455.7,164.8 L456.2,164.0 L456.7,163.3 L457.1,162.5 L457.6,161.7 L458.1,160.9 L458.6,160.1 - L459.1,159.3 L459.6,158.5 L460.1,157.7 L460.6,156.9 L461.1,156.1 L461.6,155.3 L462.1,154.5 L462.6,153.8 - L463.1,153.0 L463.6,152.2 L464.1,151.4 L464.6,150.6 L465.1,149.8 L465.6,149.0 L466.1,148.2 L466.6,147.4 - L467.1,146.6 L467.5,145.9 L468.0,145.1 L468.5,144.3 L469.0,143.5 L469.5,142.7 L470.0,141.9 L470.5,141.1 - L471.0,140.3 L471.5,139.5 L472.0,138.7 L472.5,137.9 L473.0,137.1 L473.5,136.4 L474.0,135.6 L474.5,134.8 - L475.0,134.0 L475.5,133.2 L476.0,132.4 L476.5,131.6 L477.0,130.8 L477.5,130.0 L477.9,129.2 L478.4,128.4 - L478.9,127.7 L479.4,126.9 L479.9,126.1 L480.4,125.3 L480.9,124.5 L481.4,123.7 L481.9,122.9 L482.4,122.1 - L482.9,121.3 L483.4,120.5 L483.9,119.7 L484.4,119.0 L484.9,118.2 L485.4,117.4 L485.9,116.6 L486.4,115.8 - L486.9,115.0 L487.4,114.2 L487.8,113.4 L488.3,112.6 L488.8,111.8 L489.3,111.0 L489.8,110.3 L490.3,109.5 - L490.8,108.7 L491.3,107.9 L491.8,107.1 L492.3,106.3 L492.8,105.5 L493.3,104.7 L493.8,103.9 L494.3,103.1 - L494.8,102.3 L495.3,101.5 L495.8,100.8 L496.3,100.0 L496.8,99.2 L497.3,98.4 L497.8,97.6 L498.2,96.8 - L498.7,96.0 L499.2,95.2 L499.7,94.4 L500.2,93.6 L500.7,92.9 L501.2,92.1 L501.7,91.3 L502.2,90.5 - L502.7,89.7 L503.2,88.9 L503.7,88.1 L504.2,87.3 L504.7,86.5 L505.2,85.7 L505.7,84.9 L506.2,84.2 - L506.7,83.4 L507.2,82.6 L507.7,81.8 L508.2,81.0 L508.6,80.2 L509.1,79.4 L509.6,78.6 L510.1,77.8 - L510.6,77.0 L511.1,76.2 L511.6,75.4 L512.1,74.7 L512.6,74.7 L513.1,74.7 L513.6,74.7 L514.1,74.7 - L514.6,74.7 L515.1,74.7 L515.6,74.7 L516.1,74.7 L516.6,74.7 L517.1,74.7 L517.6,74.7 L518.1,74.7 - L518.5,74.7 L519.0,74.7 L519.5,74.7 L520.0,74.7 L520.5,74.7 L521.0,74.7 L521.5,74.7 L522.0,74.7 - L522.5,74.7 L523.0,74.7 L523.5,74.7 L524.0,74.7 L524.5,74.7 L525.0,74.7 L525.5,74.7 L526.0,74.7 - L526.5,74.7 L527.0,74.7 L527.5,74.7 L528.0,74.7 L528.5,74.7 L528.9,74.7 L529.4,74.7 L529.9,74.7 - L530.4,74.7 L530.9,74.7 L531.4,74.7 L531.9,74.7 L532.4,74.7 L532.9,74.7 L533.4,74.7 L533.9,74.7 - L534.4,74.7 L534.9,74.7 L535.4,74.7 L535.9,74.7 L536.4,74.7 L536.9,74.7 L537.4,74.7 L537.9,74.7 - L538.4,74.7 L538.9,74.7 L539.3,74.7 L539.8,74.7 L540.3,74.7 L540.8,74.7 L541.3,74.7 L541.8,74.7 - L542.3,74.7 L542.8,74.7 L543.3,74.7 L543.8,74.7 L544.3,74.7 L544.8,74.7 L545.3,74.7 L545.8,74.7 - L546.3,74.7 L546.8,74.7 L547.3,74.7 L547.8,74.7 L548.3,74.7 L548.8,74.7 L549.3,74.7 L549.7,74.7 - L550.2,74.7 L550.7,74.7 L551.2,74.7 L551.7,74.7 L552.2,74.7 L552.7,74.7 L553.2,74.7 L553.7,74.7 - L554.2,74.7 L554.7,74.7 L555.2,74.7 L555.7,74.7 L556.2,74.7 L556.7,74.7 L557.2,74.7 L557.7,74.7 - L558.2,74.7 L558.7,74.7 L559.2,74.7 L559.6,74.7 L560.1,74.7 L560.6,74.7 L561.1,74.7 L561.6,74.7 - L562.1,74.7 L562.6,74.7 L563.1,74.7 L563.6,74.7 L564.1,74.7 L564.6,74.7 L565.1,74.7 L565.6,74.7 - L566.1,74.7 L566.6,74.7 '/></g> - </g> -<g fill="none" color="white" stroke="rgb(148, 0, 211)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter"> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter"> -</g> -<g fill="none" color="black" stroke="black" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> -</g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> - <path stroke='black' d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '/></g> -<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter"> -</g> -</g> -</svg> diff --git a/meson.build b/meson.build index 9d2cb444..5f3d35bc 100644 --- a/meson.build +++ b/meson.build @@ -166,7 +166,6 @@ dep_libinput_util = declare_dependency(link_with : libinput_util) ############ libfilter.a ############ src_libfilter = [ 'src/filter.c', - 'src/filter-custom.c', 'src/filter-flat.c', 'src/filter-low-dpi.c', 'src/filter-mouse.c', diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 69a4892b..02b75531 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -2612,8 +2612,26 @@ tp_init_slots(struct tp_dispatch *tp, static uint32_t tp_accel_config_get_profiles(struct libinput_device *libinput_device) { - return LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE | - LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE; + return LIBINPUT_CONFIG_ACCEL_PROFILE_NONE; +} + +static enum libinput_config_status +tp_accel_config_set_profile(struct libinput_device *libinput_device, + enum libinput_config_accel_profile profile) +{ + return LIBINPUT_CONFIG_STATUS_UNSUPPORTED; +} + +static enum libinput_config_accel_profile +tp_accel_config_get_profile(struct libinput_device *libinput_device) +{ + return LIBINPUT_CONFIG_ACCEL_PROFILE_NONE; +} + +static enum libinput_config_accel_profile +tp_accel_config_get_default_profile(struct libinput_device *libinput_device) +{ + return LIBINPUT_CONFIG_ACCEL_PROFILE_NONE; } static bool @@ -2650,9 +2668,12 @@ tp_init_accel(struct tp_dispatch *tp) evdev_device_init_pointer_acceleration(tp->device, filter); - /* override the profile hooks for get_profile because we don't - * have the flat profile on touchpads */ + /* we override the profile hooks for accel configuration with hooks + * that don't allow selection of profiles */ device->pointer.config.get_profiles = tp_accel_config_get_profiles; + device->pointer.config.set_profile = tp_accel_config_set_profile; + device->pointer.config.get_profile = tp_accel_config_get_profile; + device->pointer.config.get_default_profile = tp_accel_config_get_default_profile; return true; } diff --git a/src/evdev.c b/src/evdev.c index c6f76adb..2a7743e4 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -943,9 +943,7 @@ evdev_init_accel(struct evdev_device *device, { struct motion_filter *filter; - if (which == LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE) - filter = create_pointer_accelerator_filter_custom_device_speed(); - else if (which == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) + if (which == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) filter = create_pointer_accelerator_filter_flat(device->dpi); else if (device->tags & EVDEV_TAG_TRACKPOINT) filter = create_pointer_accelerator_filter_trackpoint(device->trackpoint_range); @@ -1004,8 +1002,7 @@ evdev_accel_config_get_profiles(struct libinput_device *libinput_device) return LIBINPUT_CONFIG_ACCEL_PROFILE_NONE; return LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE | - LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT | - LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE; + LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT; } static enum libinput_config_status @@ -1054,27 +1051,6 @@ evdev_accel_config_get_default_profile(struct libinput_device *libinput_device) return LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; } -static enum libinput_config_status -evdev_accel_config_set_curve_point(struct libinput_device *libinput_device, - double a, - double fa) -{ - struct evdev_device *device = evdev_device(libinput_device); - struct motion_filter *filter = device->pointer.filter; - - if (evdev_accel_config_get_profile(libinput_device) != - LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE) - return LIBINPUT_CONFIG_STATUS_INVALID; - - if (a < 0 || a > 50000) - return LIBINPUT_CONFIG_STATUS_INVALID; - - if (!filter_set_curve_point(filter, a, fa)) - return LIBINPUT_CONFIG_STATUS_INVALID; - - return LIBINPUT_CONFIG_STATUS_SUCCESS; -} - void evdev_device_init_pointer_acceleration(struct evdev_device *device, struct motion_filter *filter) @@ -1092,7 +1068,6 @@ evdev_device_init_pointer_acceleration(struct evdev_device *device, device->pointer.config.set_profile = evdev_accel_config_set_profile; device->pointer.config.get_profile = evdev_accel_config_get_profile; device->pointer.config.get_default_profile = evdev_accel_config_get_default_profile; - device->pointer.config.set_curve_point = evdev_accel_config_set_curve_point; device->base.config.accel = &device->pointer.config; default_speed = evdev_accel_config_get_default_speed(&device->base); diff --git a/src/filter-custom.c b/src/filter-custom.c deleted file mode 100644 index 7768aa2c..00000000 --- a/src/filter-custom.c +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright © 2018 Red Hat, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "config.h" - -#include <assert.h> -#include <float.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <limits.h> -#include <math.h> - -#include "filter.h" -#include "libinput-util.h" -#include "filter-private.h" - -struct acceleration_curve_point { - double x, fx; -}; - -struct custom_accelerator { - struct motion_filter base; - struct acceleration_curve_point points[32]; - size_t npoints; - - double last_velocity; - struct pointer_trackers trackers; -}; - -double -custom_accel_profile(struct motion_filter *filter, - void *data, - double speed_in, /* in device units/µs */ - uint64_t time) -{ - struct custom_accelerator *f = - (struct custom_accelerator*)filter; - double fx = 1; - - speed_in *= 1000; - - if (f->npoints == 0) - return 1.0; - - if (f->points[0].x >= speed_in) - return f->points[0].fx; - - for (size_t i = 0; i < f->npoints - 1; i++) { - double a, b, fa, fb; - double k, d; - - if (f->points[i + 1].x < speed_in) - continue; - - /* - We haves points f(i), f(i+1), defining two points on the - curve. linear function in the form y = kx+d: - - y = kx + d - - y1 = kx1 + d -> d = y1 - kx1 - y2 = kx2 + d -> d = y2 - kx2 - - y1 - kx1 = y2 - kx2 - y1 - y2 = kx1 - kx2 - k = y1-y2/(x1 - x2) - - */ - a = f->points[i].x; - fa = f->points[i].fx; - b = f->points[i+1].x; - fb = f->points[i+1].fx; - - k = (fa - fb)/(a - b); - d = fa - k * a; - - fx = k * speed_in + d; - - return fx; - } - - return f->points[f->npoints - 1].fx; -} - -static struct normalized_coords -custom_accelerator_filter(struct motion_filter *filter, - const struct device_float_coords *units, - void *data, uint64_t time) -{ - struct custom_accelerator *f = - (struct custom_accelerator*)filter; - struct normalized_coords norm; - double velocity; /* units/us in device-native dpi*/ - double accel_factor; - - trackers_feed(&f->trackers, units, time); - velocity = trackers_velocity(&f->trackers, time); - accel_factor = calculate_acceleration_simpsons(filter, - custom_accel_profile, - data, - velocity, - f->last_velocity, - time); - f->last_velocity = velocity; - - norm.x = accel_factor * units->x; - norm.y = accel_factor * units->y; - - return norm; -} - -static bool -custom_accelerator_set_speed(struct motion_filter *filter, - double speed_adjustment) -{ - assert(speed_adjustment >= -1.0 && speed_adjustment <= 1.0); - - /* noop, this function has no effect in the custom interface */ - - return true; -} - -static void -custom_accelerator_destroy(struct motion_filter *filter) -{ - struct custom_accelerator *accel_filter = - (struct custom_accelerator*)filter; - - trackers_free(&accel_filter->trackers); - free(accel_filter); -} - -static bool -custom_accelerator_set_curve_point(struct motion_filter *filter, - double a, double fa) -{ - struct custom_accelerator *f = - (struct custom_accelerator*)filter; - - if (f->npoints == ARRAY_LENGTH(f->points)) - return false; - - if (a < 0 || a > 50000) - return false; - - if (f->npoints == 0) { - f->points[0].x = a; - f->points[0].fx = fa; - f->npoints = 1; - return true; - } else if (f->points[f->npoints - 1].x < a) { - f->points[f->npoints].x = a; - f->points[f->npoints].fx = fa; - f->npoints++; - return true; - } - - for (size_t i = 0; i < f->npoints; i++) { - if (f->points[i].x == a) { - f->points[i].fx = fa; - break; - } else if (f->points[i].x > a) { - f->npoints++; - for (size_t j = f->npoints - 1; j > i; j--) - f->points[j] = f->points[j-1]; - f->points[i] = (struct acceleration_curve_point){ a, fa }; - break; - } - } - - return true; -} - -struct motion_filter_interface accelerator_interface_custom = { - .type = LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE, - .filter = custom_accelerator_filter, - .filter_constant = NULL, - .restart = NULL, - .destroy = custom_accelerator_destroy, - .set_speed = custom_accelerator_set_speed, - .set_curve_point = custom_accelerator_set_curve_point, -}; - -struct motion_filter * -create_pointer_accelerator_filter_custom_device_speed(void) -{ - struct custom_accelerator *filter; - - filter = zalloc(sizeof *filter); - trackers_init(&filter->trackers); - - filter->base.interface = &accelerator_interface_custom; - - return &filter->base; -} diff --git a/src/filter-private.h b/src/filter-private.h index 71415dd9..fa2fea40 100644 --- a/src/filter-private.h +++ b/src/filter-private.h @@ -44,8 +44,6 @@ struct motion_filter_interface { void (*destroy)(struct motion_filter *filter); bool (*set_speed)(struct motion_filter *filter, double speed_adjustment); - bool (*set_curve_point)(struct motion_filter *filter, - double a, double fa); }; struct motion_filter { diff --git a/src/filter.c b/src/filter.c index 15cbf44b..fe60c62a 100644 --- a/src/filter.c +++ b/src/filter.c @@ -90,15 +90,6 @@ filter_get_type(struct motion_filter *filter) return filter->interface->type; } -bool -filter_set_curve_point(struct motion_filter *filter, double a, double fa) -{ - if (!filter->interface->set_curve_point) - return false; - - return filter->interface->set_curve_point(filter, a, fa); -} - void trackers_init(struct pointer_trackers *trackers) { diff --git a/src/filter.h b/src/filter.h index 22d98e09..506ab123 100644 --- a/src/filter.h +++ b/src/filter.h @@ -95,9 +95,6 @@ filter_set_speed(struct motion_filter *filter, double filter_get_speed(struct motion_filter *filter); -bool -filter_set_curve_point(struct motion_filter *filter, double a, double fa); - enum libinput_config_accel_profile filter_get_type(struct motion_filter *filter); @@ -108,9 +105,6 @@ typedef double (*accel_profile_func_t)(struct motion_filter *filter, /* Pointer acceleration types */ struct motion_filter * -create_pointer_accelerator_filter_custom_device_speed(void); - -struct motion_filter * create_pointer_accelerator_filter_flat(int dpi); struct motion_filter * @@ -158,12 +152,6 @@ touchpad_lenovo_x230_accel_profile(struct motion_filter *filter, double speed_in, uint64_t time); double -custom_accel_profile(struct motion_filter *filter, - void *data, - double speed_in, - uint64_t time); - -double trackpoint_accel_profile(struct motion_filter *filter, void *data, double delta); diff --git a/src/libinput-private.h b/src/libinput-private.h index a6938ba6..d50154ef 100644 --- a/src/libinput-private.h +++ b/src/libinput-private.h @@ -213,8 +213,6 @@ struct libinput_device_config_accel { enum libinput_config_accel_profile); enum libinput_config_accel_profile (*get_profile)(struct libinput_device *device); enum libinput_config_accel_profile (*get_default_profile)(struct libinput_device *device); - enum libinput_config_status (*set_curve_point)(struct libinput_device *device, - double a, double fa); }; struct libinput_device_config_natural_scroll { diff --git a/src/libinput.c b/src/libinput.c index 1309ca18..78b54758 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -3708,19 +3708,6 @@ libinput_device_config_accel_get_default_speed(struct libinput_device *device) return device->config.accel->get_default_speed(device); } -LIBINPUT_EXPORT enum libinput_config_status -libinput_device_config_accel_set_curve_point( - struct libinput_device *device, - double a, double fa) -{ - if (libinput_device_config_accel_get_profile(device) != - LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE) { - return LIBINPUT_CONFIG_STATUS_INVALID; - } - - return device->config.accel->set_curve_point(device, a, fa); -} - LIBINPUT_EXPORT uint32_t libinput_device_config_accel_get_profiles(struct libinput_device *device) { @@ -3755,7 +3742,6 @@ libinput_device_config_accel_set_profile(struct libinput_device *device, switch (profile) { case LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT: case LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE: - case LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE: break; default: return LIBINPUT_CONFIG_STATUS_INVALID; diff --git a/src/libinput.h b/src/libinput.h index 857dcdfa..828cf6b4 100644 --- a/src/libinput.h +++ b/src/libinput.h @@ -4494,12 +4494,6 @@ libinput_device_config_accel_is_available(struct libinput_device *device); * range. libinput picks the semantically closest acceleration step if the * requested value does not match a discrete setting. * - * If the current acceleration profile is @ref - * LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE, the behavior of the - * device will not change but future calls to - * libinput_device_config_accel_get_speed() will reflect the updated speed - * setting. - * * @param device The device to configure * @param speed The normalized speed, in a range of [-1, 1] * @@ -4550,44 +4544,6 @@ libinput_device_config_accel_get_default_speed(struct libinput_device *device); /** * @ingroup config - * - * Sets a curve point on the custom acceleration function for this device. - * This function must be called after setting the type of the acceleration - * to @ref LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE and sets - * exactly one point on the device's acceleration curve. - * - * This function must be called multiple times to define a full acceleration - * curve. libinput uses linear interpolation between each defined curve - * point to calculate the appropriate factor. Any speed below or above the - * lowest or highest point defined is capped to the factor at the lowest or - * highest point, respectively. See @ref ptraccel-device-speed for a - * detailed explanation on this behavior. - * - * The behavior of the acceleration function depends on the type of the - * profile: - * - @ref LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE : the input data - * a is velocity in device units per millisecond, f(a) is a unitless - * factor. This factor is applied to the incoming delta so that a delta - * (x, y) is accelerated to the delta (f(a) * x, f(a) *y). The velocity - * is calculated by libinput based on the current and previous deltas and - * their timestamps. See @ref ptraccel-device-speed for details. - * - * @note libinput has a maximum limit for how many curve points may be set - * and will quietly drop curve points exceeding this limit. This limit is - * not expected to be hit by any reasonable caller. - * - * Submitting a curve point with the same value as a previous curve point - * overwrites that value. There is no facility to remove curve points, - * switch the device to a different profile and back again to reset. - * - * @return 0 on success or nonzero otherwise - */ -enum libinput_config_status -libinput_device_config_accel_set_curve_point(struct libinput_device *device, - double a, double fa); - -/** - * @ingroup config */ enum libinput_config_accel_profile { /** @@ -4609,11 +4565,6 @@ enum libinput_config_accel_profile { * on the input speed. This is the default profile for most devices. */ LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE = (1 << 1), - /** - * A custom user-provided profile. See - * libinput_acceleration_profile_set_curve_point() for details. - */ - LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE = (1 << 2), }; /** @@ -4635,13 +4586,6 @@ libinput_device_config_accel_get_profiles(struct libinput_device *device); * Set the pointer acceleration profile of this pointer device to the given * mode. * - * If the given profile is - * @ref LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE and it is - * different to the current profile, the acceleration curve is reset to an - * implementation-defined curve. The caller should call - * libinput_device_config_accel_set_curve_point() to - * define the curve points of the acceleration profile. - * * @param device The device to configure * @param mode The mode to set the device to. * diff --git a/src/libinput.sym b/src/libinput.sym index f991aeea..aa2794e9 100644 --- a/src/libinput.sym +++ b/src/libinput.sym @@ -295,6 +295,5 @@ LIBINPUT_1.9 { } LIBINPUT_1.7; LIBINPUT_1.11 { - libinput_device_config_accel_set_curve_point; libinput_device_touch_get_touch_count; } LIBINPUT_1.9; diff --git a/test/test-pointer.c b/test/test-pointer.c index 300c428b..d6ff4ffe 100644 --- a/test/test-pointer.c +++ b/test/test-pointer.c @@ -1365,23 +1365,11 @@ START_TEST(pointer_accel_direction_change) } END_TEST -static inline void -verify_set_profile(struct libinput_device *device, - enum libinput_config_accel_profile profile) -{ - enum libinput_config_accel_profile p; - enum libinput_config_status status; - - status = libinput_device_config_accel_set_profile(device, profile); - ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); - p = libinput_device_config_accel_get_profile(device); - ck_assert_int_eq(profile, p); -} - START_TEST(pointer_accel_profile_defaults) { struct litest_device *dev = litest_current_device(); struct libinput_device *device = dev->libinput_device; + enum libinput_config_status status; enum libinput_config_accel_profile profile; uint32_t profiles; @@ -1396,18 +1384,25 @@ START_TEST(pointer_accel_profile_defaults) profiles = libinput_device_config_accel_get_profiles(device); ck_assert(profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); ck_assert(profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT); - ck_assert(profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE); - verify_set_profile(device, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT); + status = libinput_device_config_accel_set_profile(device, + LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); + profile = libinput_device_config_accel_get_profile(device); + ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT); profile = libinput_device_config_accel_get_default_profile(device); ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); - verify_set_profile(device, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); + status = libinput_device_config_accel_set_profile(device, + LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); + profile = libinput_device_config_accel_get_profile(device); + ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); } END_TEST -START_TEST(pointer_accel_profile_defaults_touchpad) +START_TEST(pointer_accel_profile_defaults_noprofile) { struct litest_device *dev = litest_current_device(); struct libinput_device *device = dev->libinput_device; @@ -1418,26 +1413,25 @@ START_TEST(pointer_accel_profile_defaults_touchpad) ck_assert(libinput_device_config_accel_is_available(device)); profile = libinput_device_config_accel_get_default_profile(device); - ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); + ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_NONE); profile = libinput_device_config_accel_get_profile(device); - ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); + ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_NONE); profiles = libinput_device_config_accel_get_profiles(device); - ck_assert(profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); - ck_assert(profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE); - - verify_set_profile(device, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); - verify_set_profile(device, LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE); - profile = libinput_device_config_accel_get_default_profile(device); - ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); + ck_assert_int_eq(profiles, LIBINPUT_CONFIG_ACCEL_PROFILE_NONE); - verify_set_profile(device, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); status = libinput_device_config_accel_set_profile(device, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT); ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED); profile = libinput_device_config_accel_get_profile(device); - ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); + ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_NONE); + + status = libinput_device_config_accel_set_profile(device, + LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE); + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED); + profile = libinput_device_config_accel_get_profile(device); + ck_assert_int_eq(profile, LIBINPUT_CONFIG_ACCEL_PROFILE_NONE); } END_TEST @@ -2583,7 +2577,7 @@ TEST_COLLECTION(pointer) litest_add("pointer:accel", pointer_accel_defaults_absolute_relative, LITEST_ABSOLUTE|LITEST_RELATIVE, LITEST_ANY); litest_add("pointer:accel", pointer_accel_direction_change, LITEST_RELATIVE, LITEST_POINTINGSTICK); litest_add("pointer:accel", pointer_accel_profile_defaults, LITEST_RELATIVE, LITEST_TOUCHPAD); - litest_add("pointer:accel", pointer_accel_profile_defaults_touchpad, LITEST_TOUCHPAD, LITEST_ANY); + litest_add("pointer:accel", pointer_accel_profile_defaults_noprofile, LITEST_TOUCHPAD, LITEST_ANY); litest_add("pointer:accel", pointer_accel_profile_invalid, LITEST_RELATIVE, LITEST_ANY); litest_add("pointer:accel", pointer_accel_profile_noaccel, LITEST_ANY, LITEST_TOUCHPAD|LITEST_RELATIVE|LITEST_TABLET); litest_add("pointer:accel", pointer_accel_profile_flat_motion_relative, LITEST_RELATIVE, LITEST_TOUCHPAD); diff --git a/tools/libinput-debug-events.man b/tools/libinput-debug-events.man index 07674990..8a63821e 100644 --- a/tools/libinput-debug-events.man +++ b/tools/libinput-debug-events.man @@ -68,11 +68,6 @@ Enable or disable middle button emulation .B \-\-enable\-dwt|\-\-disable\-dwt Enable or disable disable-while-typing .TP 8 -.B \-\-set\-accel-curve-points="x1:y1;x2:y2" -Sets the curve points for the \fIcustom-speed\fR acceleration profile. The -set of curve points is a semicolon-separate lists of key-value pairs, each -separated by a colon. Each value is a non-negative double. -.TP 8 .B \-\-set\-click\-method=[none|clickfinger|buttonareas] Set the desired click method .TP 8 @@ -82,9 +77,8 @@ Set the desired scroll method .B \-\-set\-scroll\-button=BTN_MIDDLE Set the button to the given button code .TP 8 -.B \-\-set\-profile=[adaptive|flat|custom-speed] -Set pointer acceleration profile. If the \fIcustom-speed\fR profile is -selected, use \fB\-\-set-accel-curve-points\fR to specify the curve points. +.B \-\-set\-profile=[adaptive|flat] +Set pointer acceleration profile .TP 8 .B \-\-set\-speed=<value> Set pointer acceleration speed. The allowed range is [-1, 1]. diff --git a/tools/libinput-list-devices.c b/tools/libinput-list-devices.c index 060d4b29..aa225ca0 100644 --- a/tools/libinput-list-devices.c +++ b/tools/libinput-list-devices.c @@ -205,13 +205,11 @@ accel_profiles(struct libinput_device *device) profile = libinput_device_config_accel_get_default_profile(device); xasprintf(&str, - "%s%s %s%s %s%s", + "%s%s %s%s", (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "*" : "", (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT) ? "flat" : "", (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "*" : "", - (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "adaptive" : "", - (profile == LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE) ? "*" : "", - (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE) ? "custom-speed" : ""); + (profiles & LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) ? "adaptive" : ""); return str; } diff --git a/tools/ptraccel-debug.c b/tools/ptraccel-debug.c index a98b615d..670f0457 100644 --- a/tools/ptraccel-debug.c +++ b/tools/ptraccel-debug.c @@ -161,12 +161,11 @@ print_accel_func(struct motion_filter *filter, printf("# set style data lines\n"); printf("# plot \"gnuplot.data\" using 1:2 title 'accel factor'\n"); printf("#\n"); - printf("# data: velocity(mm/s) factor velocity(units/us) velocity(units/ms)\n"); + printf("# data: velocity(mm/s) factor velocity(units/us)\n"); for (mmps = 0.0; mmps < 1000.0; mmps += 1) { double units_per_us = mmps_to_upus(mmps, dpi); - double units_per_ms = units_per_us * 1000; double result = profile(filter, NULL, units_per_us, 0 /* time */); - printf("%.8f\t%.4f\t%.8f\t%.8f\n", mmps, result, units_per_us, units_per_ms); + printf("%.8f\t%.4f\t%.8f\n", mmps, result, units_per_us); } } @@ -244,7 +243,6 @@ main(int argc, char **argv) const char *filter_type = "linear"; accel_profile_func_t profile = NULL; int tp_range_max = 20; - const char *curve_points = NULL; enum { OPT_HELP = 1, @@ -256,7 +254,6 @@ main(int argc, char **argv) OPT_DPI, OPT_FILTER, OPT_TRACKPOINT_RANGE, - OPT_CURVE_POINTS, }; while (1) { @@ -272,7 +269,6 @@ main(int argc, char **argv) {"dpi", 1, 0, OPT_DPI }, {"filter", 1, 0, OPT_FILTER }, {"trackpoint-range", 1, 0, OPT_TRACKPOINT_RANGE }, - {"curve-points", 1, 0, OPT_CURVE_POINTS }, {0, 0, 0, 0} }; @@ -333,9 +329,6 @@ main(int argc, char **argv) case OPT_TRACKPOINT_RANGE: tp_range_max = strtod(optarg, NULL); break; - case OPT_CURVE_POINTS: - curve_points = optarg; - break; default: usage(); exit(1); @@ -358,24 +351,6 @@ main(int argc, char **argv) } else if (streq(filter_type, "trackpoint")) { filter = create_pointer_accelerator_filter_trackpoint(tp_range_max); profile = NULL; /* trackpoint is special */ - } else if (streq(filter_type, "custom-speed")) { - struct key_value_double *points; - ssize_t npoints; - - filter = create_pointer_accelerator_filter_custom_device_speed(); - profile = custom_accel_profile; - - npoints = kv_double_from_string(curve_points, ";", ":", &points); - if (npoints <= 0) - return 1; - - for (ssize_t idx = 0; idx < npoints; idx++){ - filter_set_curve_point(filter, - points[idx].key, - points[idx].value); - } - - free(points); } else { fprintf(stderr, "Invalid filter type %s\n", filter_type); return 1; diff --git a/tools/shared.c b/tools/shared.c index 85c0d739..c1ce6473 100644 --- a/tools/shared.c +++ b/tools/shared.c @@ -218,17 +218,6 @@ tools_parse_option(int option, "%s", optarg); break; - case OPT_CURVE_POINTS: - if (!optarg) - return 1; - - options->ncurve_points = kv_double_from_string( - optarg, - ";", ":", - &options->curve_points); - if (options->ncurve_points < 0) - return 1; - break; } return 0; @@ -397,16 +386,6 @@ tools_device_apply_config(struct libinput_device *device, libinput_device_config_send_events_set_mode(device, LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); } - - if (libinput_device_config_accel_get_profile(device) == - LIBINPUT_CONFIG_ACCEL_PROFILE_DEVICE_SPEED_CURVE) { - for (ssize_t idx = 0; idx < options->ncurve_points; idx++) { - double x = options->curve_points[idx].key, - fx = options->curve_points[idx].value; - - libinput_device_config_accel_set_curve_point(device, x, fx); - } - } } static char* diff --git a/tools/shared.h b/tools/shared.h index dc61b5b7..55e15409 100644 --- a/tools/shared.h +++ b/tools/shared.h @@ -50,7 +50,6 @@ enum configuration_options { OPT_SPEED, OPT_PROFILE, OPT_DISABLE_SENDEVENTS, - OPT_CURVE_POINTS, }; #define CONFIGURATION_OPTIONS \ @@ -74,8 +73,7 @@ enum configuration_options { { "set-scroll-button", required_argument, 0, OPT_SCROLL_BUTTON }, \ { "set-profile", required_argument, 0, OPT_PROFILE }, \ { "set-tap-map", required_argument, 0, OPT_TAP_MAP }, \ - { "set-speed", required_argument, 0, OPT_SPEED }, \ - { "set-accel-curve-points", required_argument, 0, OPT_CURVE_POINTS } + { "set-speed", required_argument, 0, OPT_SPEED } enum tools_backend { BACKEND_DEVICE, @@ -97,9 +95,6 @@ struct tools_options { int dwt; enum libinput_config_accel_profile profile; char disable_pattern[64]; - - struct key_value_double *curve_points; - ssize_t ncurve_points; }; void tools_init_options(struct tools_options *options); |