1
0

test-touchpad-buttons.c 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144
  1. /*
  2. * Copyright © 2014 Red Hat, Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. */
  23. #include <config.h>
  24. #include <errno.h>
  25. #include <fcntl.h>
  26. #include <libinput.h>
  27. #include <unistd.h>
  28. #include "libinput-util.h"
  29. #include "litest.h"
  30. START_TEST(touchpad_button)
  31. {
  32. struct litest_device *dev = litest_current_device();
  33. struct libinput *li = dev->libinput;
  34. if (!libevdev_has_event_code(dev->evdev, EV_KEY, BTN_LEFT))
  35. return LITEST_NOT_APPLICABLE;
  36. litest_drain_events(li);
  37. litest_button_click(dev, BTN_LEFT, true);
  38. litest_dispatch(li);
  39. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  40. litest_button_click(dev, BTN_LEFT, false);
  41. litest_dispatch(li);
  42. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  43. }
  44. END_TEST
  45. START_TEST(touchpad_click_defaults_clickfinger)
  46. {
  47. struct litest_device *dev = litest_current_device();
  48. struct libinput_device *device = dev->libinput_device;
  49. uint32_t methods, method;
  50. enum libinput_config_status status;
  51. /* call this test for apple touchpads */
  52. methods = libinput_device_config_click_get_methods(device);
  53. litest_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  54. litest_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  55. method = libinput_device_config_click_get_method(device);
  56. litest_assert_enum_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  57. method = libinput_device_config_click_get_default_method(device);
  58. litest_assert_enum_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  59. status = libinput_device_config_click_set_method(
  60. device,
  61. LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  62. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  63. status = libinput_device_config_click_set_method(
  64. device,
  65. LIBINPUT_CONFIG_CLICK_METHOD_NONE);
  66. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  67. }
  68. END_TEST
  69. START_TEST(touchpad_click_default_clickfinger_map)
  70. {
  71. struct litest_device *dev = litest_current_device();
  72. struct libinput_device *device = dev->libinput_device;
  73. enum libinput_config_clickfinger_button_map map;
  74. map = libinput_device_config_click_get_clickfinger_button_map(device);
  75. litest_assert_enum_eq(map, LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM);
  76. map = libinput_device_config_click_get_default_clickfinger_button_map(device);
  77. litest_assert_enum_eq(map, LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM);
  78. }
  79. END_TEST
  80. START_TEST(touchpad_click_set_clickfinger_map)
  81. {
  82. struct litest_device *dev = litest_current_device();
  83. struct libinput_device *device = dev->libinput_device;
  84. enum libinput_config_clickfinger_button_map map;
  85. enum libinput_config_status status;
  86. map = LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM;
  87. status = libinput_device_config_click_set_clickfinger_button_map(device, map);
  88. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  89. map = libinput_device_config_click_get_clickfinger_button_map(
  90. dev->libinput_device);
  91. litest_assert_enum_eq(map, LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM);
  92. map = LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR;
  93. status = libinput_device_config_click_set_clickfinger_button_map(device, map);
  94. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  95. map = libinput_device_config_click_get_clickfinger_button_map(
  96. dev->libinput_device);
  97. litest_assert_enum_eq(map, LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR);
  98. map = LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM - 1;
  99. status = libinput_device_config_click_set_clickfinger_button_map(device, map);
  100. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  101. map = LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR + 1;
  102. status = libinput_device_config_click_set_clickfinger_button_map(device, map);
  103. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  104. }
  105. END_TEST
  106. START_TEST(touchpad_click_defaults_btnarea)
  107. {
  108. struct litest_device *dev = litest_current_device();
  109. struct libinput_device *device = dev->libinput_device;
  110. uint32_t methods, method;
  111. enum libinput_config_status status;
  112. /* call this test for non-apple clickpads */
  113. methods = libinput_device_config_click_get_methods(device);
  114. litest_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  115. litest_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  116. method = libinput_device_config_click_get_method(device);
  117. litest_assert_enum_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  118. method = libinput_device_config_click_get_default_method(device);
  119. litest_assert_enum_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  120. status = libinput_device_config_click_set_method(
  121. device,
  122. LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  123. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  124. status = libinput_device_config_click_set_method(
  125. device,
  126. LIBINPUT_CONFIG_CLICK_METHOD_NONE);
  127. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  128. }
  129. END_TEST
  130. START_TEST(touchpad_click_defaults_none)
  131. {
  132. struct litest_device *dev = litest_current_device();
  133. struct libinput_device *device = dev->libinput_device;
  134. uint32_t methods, method;
  135. enum libinput_config_status status;
  136. if (libevdev_get_id_vendor(dev->evdev) == VENDOR_ID_APPLE &&
  137. libevdev_get_id_product(dev->evdev) == PRODUCT_ID_APPLE_APPLETOUCH)
  138. return LITEST_NOT_APPLICABLE;
  139. /* call this test for non-clickpads and non-touchpads */
  140. methods = libinput_device_config_click_get_methods(device);
  141. litest_assert_int_eq(methods, 0U);
  142. method = libinput_device_config_click_get_method(device);
  143. litest_assert_enum_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_NONE);
  144. method = libinput_device_config_click_get_default_method(device);
  145. litest_assert_enum_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_NONE);
  146. status = libinput_device_config_click_set_method(
  147. device,
  148. LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  149. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
  150. status = libinput_device_config_click_set_method(
  151. device,
  152. LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  153. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
  154. }
  155. END_TEST
  156. START_TEST(touchpad_1fg_clickfinger)
  157. {
  158. struct litest_device *dev = litest_current_device();
  159. struct libinput *li = dev->libinput;
  160. litest_enable_clickfinger(dev);
  161. litest_drain_events(li);
  162. litest_touch_down(dev, 0, 50, 50);
  163. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  164. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  165. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  166. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  167. litest_touch_up(dev, 0);
  168. litest_dispatch(li);
  169. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  170. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  171. }
  172. END_TEST
  173. START_TEST(touchpad_1fg_clickfinger_no_touch)
  174. {
  175. struct litest_device *dev = litest_current_device();
  176. struct libinput *li = dev->libinput;
  177. if (dev->which == LITEST_SYNAPTICS_PHANTOMCLICKS) {
  178. /* The XPS 15 9500 touchpad has the ModelTouchpadPhantomClicks
  179. * quirk enabled and doesn't generate events without touches. */
  180. return LITEST_NOT_APPLICABLE;
  181. }
  182. litest_enable_clickfinger(dev);
  183. litest_drain_events(li);
  184. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  185. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  186. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  187. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  188. litest_dispatch(li);
  189. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  190. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  191. }
  192. END_TEST
  193. START_TEST(touchpad_1fg_clickfinger_no_touch_phantomclicks)
  194. {
  195. struct litest_device *dev = litest_current_device();
  196. struct libinput *li = dev->libinput;
  197. litest_enable_clickfinger(dev);
  198. litest_drain_events(li);
  199. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  200. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  201. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  202. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  203. litest_dispatch(li);
  204. litest_assert_empty_queue(li);
  205. }
  206. END_TEST
  207. START_TEST(touchpad_2fg_clickfinger)
  208. {
  209. struct litest_device *dev = litest_current_device();
  210. struct libinput *li = dev->libinput;
  211. unsigned int button = 0;
  212. enum libinput_config_clickfinger_button_map map =
  213. litest_test_param_get_i32(test_env->params, "map");
  214. litest_enable_clickfinger(dev);
  215. litest_set_clickfinger_map(dev, map);
  216. switch (map) {
  217. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM:
  218. button = BTN_RIGHT;
  219. break;
  220. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR:
  221. button = BTN_MIDDLE;
  222. break;
  223. default:
  224. litest_abort_msg("Invalid map range %d", map);
  225. }
  226. litest_drain_events(li);
  227. litest_touch_down(dev, 0, 50, 50);
  228. litest_touch_down(dev, 1, 70, 70);
  229. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  230. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  231. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  232. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  233. litest_touch_up(dev, 0);
  234. litest_touch_up(dev, 1);
  235. litest_dispatch(li);
  236. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_PRESSED);
  237. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_RELEASED);
  238. }
  239. END_TEST
  240. START_TEST(touchpad_3fg_clickfinger)
  241. {
  242. struct litest_device *dev = litest_current_device();
  243. struct libinput *li = dev->libinput;
  244. unsigned int button = 0;
  245. enum libinput_config_clickfinger_button_map map =
  246. litest_test_param_get_i32(test_env->params, "map");
  247. if (litest_slot_count(dev) < 3)
  248. return LITEST_NOT_APPLICABLE;
  249. litest_enable_clickfinger(dev);
  250. litest_set_clickfinger_map(dev, map);
  251. switch (map) {
  252. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM:
  253. button = BTN_MIDDLE;
  254. break;
  255. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR:
  256. button = BTN_RIGHT;
  257. break;
  258. default:
  259. litest_abort_msg("Invalid map range %d", map);
  260. }
  261. litest_drain_events(li);
  262. litest_touch_down(dev, 0, 50, 50);
  263. litest_touch_down(dev, 1, 60, 70);
  264. litest_touch_down(dev, 2, 70, 70);
  265. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  266. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  267. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  268. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  269. litest_touch_up(dev, 0);
  270. litest_touch_up(dev, 1);
  271. litest_touch_up(dev, 2);
  272. litest_dispatch(li);
  273. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_PRESSED);
  274. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_RELEASED);
  275. }
  276. END_TEST
  277. START_TEST(touchpad_3fg_clickfinger_btntool)
  278. {
  279. struct litest_device *dev = litest_current_device();
  280. struct libinput *li = dev->libinput;
  281. unsigned int button = 0;
  282. enum libinput_config_clickfinger_button_map map =
  283. litest_test_param_get_i32(test_env->params, "map");
  284. if (litest_slot_count(dev) >= 3 ||
  285. !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_TRIPLETAP))
  286. return LITEST_NOT_APPLICABLE;
  287. litest_enable_clickfinger(dev);
  288. litest_set_clickfinger_map(dev, map);
  289. switch (map) {
  290. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM:
  291. button = BTN_MIDDLE;
  292. break;
  293. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR:
  294. button = BTN_RIGHT;
  295. break;
  296. default:
  297. litest_abort_msg("Invalid map range %d", map);
  298. }
  299. litest_drain_events(li);
  300. litest_touch_down(dev, 0, 50, 50);
  301. litest_touch_down(dev, 1, 60, 70);
  302. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  303. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  304. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  305. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  306. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  307. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  308. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  309. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  310. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  311. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  312. litest_touch_up(dev, 0);
  313. litest_touch_up(dev, 1);
  314. litest_dispatch(li);
  315. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_PRESSED);
  316. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_RELEASED);
  317. }
  318. END_TEST
  319. START_TEST(touchpad_4fg_clickfinger)
  320. {
  321. struct litest_device *dev = litest_current_device();
  322. struct libinput *li = dev->libinput;
  323. if (litest_slot_count(dev) < 4)
  324. return LITEST_NOT_APPLICABLE;
  325. litest_enable_clickfinger(dev);
  326. litest_drain_events(li);
  327. litest_touch_down(dev, 0, 50, 50);
  328. litest_touch_down(dev, 1, 60, 70);
  329. litest_touch_down(dev, 2, 70, 70);
  330. litest_touch_down(dev, 3, 80, 70);
  331. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  332. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  333. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  334. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  335. litest_touch_up(dev, 0);
  336. litest_touch_up(dev, 1);
  337. litest_touch_up(dev, 2);
  338. litest_touch_up(dev, 3);
  339. litest_dispatch(li);
  340. litest_assert_empty_queue(li);
  341. }
  342. END_TEST
  343. START_TEST(touchpad_4fg_clickfinger_btntool_2slots)
  344. {
  345. struct litest_device *dev = litest_current_device();
  346. struct libinput *li = dev->libinput;
  347. if (litest_slot_count(dev) >= 3 ||
  348. !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_QUADTAP))
  349. return LITEST_NOT_APPLICABLE;
  350. litest_enable_clickfinger(dev);
  351. litest_drain_events(li);
  352. litest_touch_down(dev, 0, 50, 50);
  353. litest_touch_down(dev, 1, 60, 70);
  354. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  355. litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 1);
  356. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  357. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  358. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  359. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  360. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  361. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  362. litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 0);
  363. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  364. litest_touch_up(dev, 0);
  365. litest_touch_up(dev, 1);
  366. litest_assert_empty_queue(li);
  367. }
  368. END_TEST
  369. START_TEST(touchpad_4fg_clickfinger_btntool_3slots)
  370. {
  371. struct litest_device *dev = litest_current_device();
  372. struct libinput *li = dev->libinput;
  373. if (litest_slot_count(dev) != 3 ||
  374. !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_TRIPLETAP))
  375. return LITEST_NOT_APPLICABLE;
  376. litest_enable_clickfinger(dev);
  377. litest_drain_events(li);
  378. litest_touch_down(dev, 0, 50, 50);
  379. litest_touch_down(dev, 1, 60, 70);
  380. litest_touch_down(dev, 2, 70, 70);
  381. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  382. litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 1);
  383. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  384. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  385. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  386. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  387. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  388. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  389. litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 0);
  390. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  391. litest_touch_up(dev, 0);
  392. litest_touch_up(dev, 1);
  393. litest_touch_up(dev, 2);
  394. litest_dispatch(li);
  395. litest_assert_empty_queue(li);
  396. }
  397. END_TEST
  398. START_TEST(touchpad_2fg_clickfinger_distance)
  399. {
  400. struct litest_device *dev = litest_current_device();
  401. struct libinput *li = dev->libinput;
  402. double w, h;
  403. bool small_touchpad = false;
  404. unsigned int expected_button = 0;
  405. enum libinput_config_clickfinger_button_map map =
  406. litest_test_param_get_i32(test_env->params, "map");
  407. if (libinput_device_get_size(dev->libinput_device, &w, &h) == 0 && h < 50.0)
  408. small_touchpad = true;
  409. litest_enable_clickfinger(dev);
  410. litest_set_clickfinger_map(dev, map);
  411. litest_drain_events(li);
  412. litest_touch_down(dev, 0, 90, 50);
  413. litest_touch_down(dev, 1, 10, 50);
  414. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  415. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  416. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  417. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  418. litest_touch_up(dev, 0);
  419. litest_touch_up(dev, 1);
  420. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  421. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  422. litest_assert_empty_queue(li);
  423. litest_touch_down(dev, 0, 50, 5);
  424. litest_touch_down(dev, 1, 50, 95);
  425. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  426. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  427. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  428. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  429. litest_touch_up(dev, 0);
  430. litest_touch_up(dev, 1);
  431. /* if the touchpad is small enough, we expect all fingers to count
  432. * for clickfinger */
  433. if (small_touchpad)
  434. switch (map) {
  435. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM:
  436. expected_button = BTN_RIGHT;
  437. break;
  438. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR:
  439. expected_button = BTN_MIDDLE;
  440. break;
  441. }
  442. else
  443. expected_button = BTN_LEFT;
  444. litest_assert_button_event(li, expected_button, LIBINPUT_BUTTON_STATE_PRESSED);
  445. litest_assert_button_event(li, expected_button, LIBINPUT_BUTTON_STATE_RELEASED);
  446. }
  447. END_TEST
  448. START_TEST(touchpad_3fg_clickfinger_distance)
  449. {
  450. struct litest_device *dev = litest_current_device();
  451. struct libinput *li = dev->libinput;
  452. unsigned int button = 0;
  453. enum libinput_config_clickfinger_button_map map =
  454. litest_test_param_get_i32(test_env->params, "map");
  455. if (litest_slot_count(dev) < 3)
  456. return LITEST_NOT_APPLICABLE;
  457. litest_enable_clickfinger(dev);
  458. litest_set_clickfinger_map(dev, map);
  459. switch (map) {
  460. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM:
  461. button = BTN_MIDDLE;
  462. break;
  463. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR:
  464. button = BTN_RIGHT;
  465. break;
  466. default:
  467. litest_abort_msg("Invalid map range %d", map);
  468. }
  469. litest_drain_events(li);
  470. litest_touch_down(dev, 0, 90, 20);
  471. litest_touch_down(dev, 1, 10, 15);
  472. litest_touch_down(dev, 2, 10, 15);
  473. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  474. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  475. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  476. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  477. litest_touch_up(dev, 0);
  478. litest_touch_up(dev, 1);
  479. litest_touch_up(dev, 2);
  480. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_PRESSED);
  481. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_RELEASED);
  482. }
  483. END_TEST
  484. START_TEST(touchpad_3fg_clickfinger_distance_btntool)
  485. {
  486. struct litest_device *dev = litest_current_device();
  487. struct libinput *li = dev->libinput;
  488. unsigned int button = 0;
  489. enum libinput_config_clickfinger_button_map map =
  490. litest_test_param_get_i32(test_env->params, "map");
  491. if (litest_slot_count(dev) > 2)
  492. return LITEST_NOT_APPLICABLE;
  493. litest_enable_clickfinger(dev);
  494. litest_set_clickfinger_map(dev, map);
  495. switch (map) {
  496. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM:
  497. button = BTN_MIDDLE;
  498. break;
  499. case LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR:
  500. button = BTN_RIGHT;
  501. break;
  502. default:
  503. litest_abort_msg("Invalid map range %d", map);
  504. }
  505. litest_drain_events(li);
  506. litest_touch_down(dev, 0, 90, 15);
  507. litest_touch_down(dev, 1, 10, 15);
  508. litest_dispatch(li);
  509. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  510. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  511. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  512. litest_dispatch(li);
  513. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  514. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  515. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  516. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  517. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  518. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  519. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  520. litest_touch_up(dev, 0);
  521. litest_touch_up(dev, 1);
  522. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_PRESSED);
  523. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_RELEASED);
  524. }
  525. END_TEST
  526. START_TEST(touchpad_2fg_clickfinger_bottom)
  527. {
  528. struct litest_device *dev = litest_current_device();
  529. struct libinput *li = dev->libinput;
  530. /* this test is run for the T440s touchpad only, makes getting the
  531. * mm correct easier */
  532. libinput_device_config_click_set_method(
  533. dev->libinput_device,
  534. LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  535. litest_drain_events(li);
  536. /* one above, one below the magic line, vert spread ca 27mm */
  537. litest_touch_down(dev, 0, 40, 60);
  538. litest_touch_down(dev, 1, 60, 100);
  539. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  540. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  541. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  542. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  543. litest_touch_up(dev, 0);
  544. litest_touch_up(dev, 1);
  545. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  546. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  547. litest_assert_empty_queue(li);
  548. /* both below the magic line */
  549. litest_touch_down(dev, 0, 40, 100);
  550. litest_touch_down(dev, 1, 60, 95);
  551. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  552. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  553. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  554. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  555. litest_touch_up(dev, 0);
  556. litest_touch_up(dev, 1);
  557. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  558. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  559. /* one above, one below the magic line, vert spread 17mm */
  560. litest_touch_down(dev, 0, 50, 75);
  561. litest_touch_down(dev, 1, 55, 100);
  562. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  563. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  564. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  565. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  566. litest_touch_up(dev, 0);
  567. litest_touch_up(dev, 1);
  568. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  569. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  570. }
  571. END_TEST
  572. START_TEST(touchpad_clickfinger_to_area_method)
  573. {
  574. struct litest_device *dev = litest_current_device();
  575. struct libinput *li = dev->libinput;
  576. litest_drain_events(li);
  577. litest_enable_buttonareas(dev);
  578. litest_touch_down(dev, 0, 95, 95);
  579. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  580. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  581. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  582. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  583. litest_touch_up(dev, 0);
  584. litest_dispatch(li);
  585. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  586. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  587. litest_enable_clickfinger(dev);
  588. litest_drain_events(li);
  589. /* use bottom right corner to catch accidental softbutton right */
  590. litest_touch_down(dev, 0, 95, 95);
  591. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  592. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  593. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  594. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  595. litest_touch_up(dev, 0);
  596. litest_dispatch(li);
  597. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  598. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  599. }
  600. END_TEST
  601. START_TEST(touchpad_clickfinger_to_area_method_while_down)
  602. {
  603. struct litest_device *dev = litest_current_device();
  604. struct libinput *li = dev->libinput;
  605. litest_drain_events(li);
  606. litest_enable_buttonareas(dev);
  607. litest_touch_down(dev, 0, 95, 95);
  608. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  609. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  610. litest_dispatch(li);
  611. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  612. litest_enable_clickfinger(dev);
  613. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  614. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  615. litest_touch_up(dev, 0);
  616. litest_dispatch(li);
  617. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  618. litest_drain_events(li);
  619. /* use bottom right corner to catch accidental softbutton right */
  620. litest_touch_down(dev, 0, 95, 95);
  621. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  622. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  623. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  624. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  625. litest_touch_up(dev, 0);
  626. litest_dispatch(li);
  627. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  628. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  629. }
  630. END_TEST
  631. START_TEST(touchpad_area_to_clickfinger_method)
  632. {
  633. struct litest_device *dev = litest_current_device();
  634. struct libinput *li = dev->libinput;
  635. litest_enable_clickfinger(dev);
  636. litest_drain_events(li);
  637. /* use bottom right corner to catch accidental softbutton right */
  638. litest_touch_down(dev, 0, 95, 95);
  639. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  640. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  641. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  642. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  643. litest_touch_up(dev, 0);
  644. litest_dispatch(li);
  645. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  646. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  647. litest_enable_buttonareas(dev);
  648. litest_touch_down(dev, 0, 95, 95);
  649. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  650. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  651. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  652. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  653. litest_touch_up(dev, 0);
  654. litest_dispatch(li);
  655. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  656. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  657. }
  658. END_TEST
  659. START_TEST(touchpad_area_to_clickfinger_method_while_down)
  660. {
  661. struct litest_device *dev = litest_current_device();
  662. struct libinput *li = dev->libinput;
  663. litest_enable_clickfinger(dev);
  664. litest_drain_events(li);
  665. /* use bottom right corner to catch accidental softbutton right */
  666. litest_touch_down(dev, 0, 95, 95);
  667. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  668. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  669. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  670. litest_enable_buttonareas(dev);
  671. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  672. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  673. litest_touch_up(dev, 0);
  674. litest_dispatch(li);
  675. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  676. litest_touch_down(dev, 0, 95, 95);
  677. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  678. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  679. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  680. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  681. litest_touch_up(dev, 0);
  682. litest_dispatch(li);
  683. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  684. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  685. }
  686. END_TEST
  687. START_TEST(touchpad_clickfinger_3fg_tool_position)
  688. {
  689. struct litest_device *dev = litest_current_device();
  690. struct libinput *li = dev->libinput;
  691. litest_enable_clickfinger(dev);
  692. litest_drain_events(li);
  693. /* one in thumb area, one in normal area + TRIPLETAP. spread is wide
  694. * but any non-palm 3fg touch+click counts as middle */
  695. litest_touch_down(dev, 0, 20, 99);
  696. litest_touch_down(dev, 1, 90, 15);
  697. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  698. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  699. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  700. litest_dispatch(li);
  701. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  702. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  703. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  704. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  705. litest_dispatch(li);
  706. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  707. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  708. }
  709. END_TEST
  710. START_TEST(touchpad_clickfinger_4fg_tool_position)
  711. {
  712. struct litest_device *dev = litest_current_device();
  713. struct libinput *li = dev->libinput;
  714. litest_enable_clickfinger(dev);
  715. litest_drain_events(li);
  716. litest_touch_down(dev, 0, 5, 99);
  717. litest_touch_down(dev, 1, 90, 15);
  718. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  719. litest_event(dev, EV_KEY, BTN_TOOL_QUADTAP, 1);
  720. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  721. litest_dispatch(li);
  722. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  723. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  724. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  725. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  726. litest_dispatch(li);
  727. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  728. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  729. }
  730. END_TEST
  731. START_TEST(touchpad_clickfinger_appletouch_config)
  732. {
  733. struct litest_device *dev = litest_current_device();
  734. struct libinput_device *device = dev->libinput_device;
  735. uint32_t methods, method;
  736. enum libinput_config_status status;
  737. methods = libinput_device_config_click_get_methods(device);
  738. litest_assert(!(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS));
  739. litest_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  740. method = libinput_device_config_click_get_method(device);
  741. litest_assert_enum_eq(method, LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  742. status = libinput_device_config_click_set_method(
  743. device,
  744. LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  745. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
  746. status = libinput_device_config_click_set_method(
  747. device,
  748. LIBINPUT_CONFIG_CLICK_METHOD_NONE);
  749. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  750. }
  751. END_TEST
  752. START_TEST(touchpad_clickfinger_appletouch_1fg)
  753. {
  754. struct litest_device *dev = litest_current_device();
  755. struct libinput *li = dev->libinput;
  756. litest_enable_clickfinger(dev);
  757. litest_drain_events(li);
  758. litest_touch_down(dev, 0, 50, 50);
  759. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  760. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  761. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  762. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  763. litest_touch_up(dev, 0);
  764. litest_dispatch(li);
  765. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  766. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  767. }
  768. END_TEST
  769. START_TEST(touchpad_clickfinger_appletouch_2fg)
  770. {
  771. struct litest_device *dev = litest_current_device();
  772. struct libinput *li = dev->libinput;
  773. litest_enable_clickfinger(dev);
  774. litest_drain_events(li);
  775. litest_touch_down(dev, 0, 50, 50);
  776. litest_touch_down(dev, 1, 50, 50);
  777. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  778. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  779. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  780. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  781. litest_touch_up(dev, 0);
  782. litest_touch_up(dev, 1);
  783. litest_dispatch(li);
  784. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  785. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  786. }
  787. END_TEST
  788. START_TEST(touchpad_clickfinger_appletouch_3fg)
  789. {
  790. struct litest_device *dev = litest_current_device();
  791. struct libinput *li = dev->libinput;
  792. litest_enable_clickfinger(dev);
  793. litest_drain_events(li);
  794. litest_touch_down(dev, 0, 50, 50);
  795. litest_touch_down(dev, 1, 50, 50);
  796. litest_touch_down(dev, 2, 50, 50);
  797. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  798. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  799. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  800. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  801. litest_touch_up(dev, 0);
  802. litest_touch_up(dev, 1);
  803. litest_touch_up(dev, 2);
  804. litest_dispatch(li);
  805. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  806. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  807. }
  808. END_TEST
  809. START_TEST(touchpad_clickfinger_click_drag)
  810. {
  811. struct litest_device *dev = litest_current_device();
  812. struct libinput *li = dev->libinput;
  813. int nfingers = litest_test_param_get_i32(test_env->params, "fingers");
  814. unsigned int button;
  815. int nslots = litest_slot_count(dev);
  816. litest_enable_clickfinger(dev);
  817. litest_drain_events(li);
  818. litest_touch_down(dev, 0, 40, 50);
  819. button = BTN_LEFT;
  820. if (nfingers > 1) {
  821. if (nslots > 1) {
  822. litest_touch_down(dev, 1, 50, 50);
  823. } else {
  824. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  825. }
  826. button = BTN_RIGHT;
  827. }
  828. if (nfingers > 2) {
  829. if (nslots > 2) {
  830. litest_touch_down(dev, 2, 60, 50);
  831. } else {
  832. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  833. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  834. }
  835. button = BTN_MIDDLE;
  836. }
  837. litest_button_click(dev, BTN_LEFT, true);
  838. litest_dispatch(li);
  839. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_PRESSED);
  840. for (int i = 0; i < 20; i++) {
  841. litest_push_event_frame(dev);
  842. switch (nfingers) {
  843. case 3:
  844. if (nslots >= nfingers)
  845. litest_touch_move(dev, 2, 60, 50 + i);
  846. _fallthrough_;
  847. case 2:
  848. if (nslots >= nfingers)
  849. litest_touch_move(dev, 1, 50, 50 + i);
  850. _fallthrough_;
  851. case 1:
  852. litest_touch_move(dev, 0, 40, 50 + i);
  853. break;
  854. }
  855. litest_pop_event_frame(dev);
  856. litest_dispatch(li);
  857. }
  858. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  859. litest_button_click(dev, BTN_LEFT, false);
  860. litest_assert_button_event(li, button, LIBINPUT_BUTTON_STATE_RELEASED);
  861. if (nfingers > 3) {
  862. if (nslots > 3) {
  863. litest_touch_up(dev, 2);
  864. } else {
  865. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  866. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  867. }
  868. }
  869. if (nfingers > 2) {
  870. if (nslots > 2) {
  871. litest_touch_up(dev, 1);
  872. } else {
  873. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  874. }
  875. }
  876. litest_touch_up(dev, 0);
  877. litest_dispatch(li);
  878. litest_assert_empty_queue(li);
  879. }
  880. END_TEST
  881. START_TEST(touchpad_btn_left)
  882. {
  883. struct litest_device *dev = litest_current_device();
  884. struct libinput *li = dev->libinput;
  885. litest_drain_events(li);
  886. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  887. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  888. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  889. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  890. litest_dispatch(li);
  891. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  892. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  893. }
  894. END_TEST
  895. START_TEST(clickpad_btn_left)
  896. {
  897. struct litest_device *dev = litest_current_device();
  898. struct libinput *li = dev->libinput;
  899. litest_enable_buttonareas(dev);
  900. litest_drain_events(li);
  901. /* A clickpad always needs a finger down to tell where the
  902. click happens */
  903. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  904. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  905. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  906. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  907. litest_assert_empty_queue(li);
  908. }
  909. END_TEST
  910. START_TEST(clickpad_click_n_drag)
  911. {
  912. struct litest_device *dev = litest_current_device();
  913. struct libinput *li = dev->libinput;
  914. litest_drain_events(li);
  915. litest_touch_down(dev, 0, 50, 50);
  916. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  917. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  918. litest_dispatch(li);
  919. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  920. litest_assert_empty_queue(li);
  921. /* now put a second finger down */
  922. litest_touch_down(dev, 1, 70, 70);
  923. litest_touch_move_to(dev, 1, 70, 70, 80, 50, 5);
  924. litest_touch_up(dev, 1);
  925. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  926. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  927. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  928. litest_touch_up(dev, 0);
  929. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  930. }
  931. END_TEST
  932. START_TEST(clickpad_finger_pin)
  933. {
  934. struct litest_device *dev = litest_current_device();
  935. struct libinput *li = dev->libinput;
  936. struct libevdev *evdev = dev->evdev;
  937. const struct input_absinfo *abs;
  938. double w, h;
  939. double dist;
  940. abs = libevdev_get_abs_info(evdev, ABS_MT_POSITION_X);
  941. litest_assert_notnull(abs);
  942. if (abs->resolution == 0)
  943. return LITEST_NOT_APPLICABLE;
  944. if (libinput_device_get_size(dev->libinput_device, &w, &h) != 0)
  945. return LITEST_NOT_APPLICABLE;
  946. dist = 100.0 / max(w, h);
  947. litest_drain_events(li);
  948. /* make sure the movement generates pointer events when
  949. not pinned */
  950. litest_touch_down(dev, 0, 50, 50);
  951. litest_touch_move_to(dev, 0, 50, 50, 54, 54, 10);
  952. litest_touch_move_to(dev, 0, 54, 54, 46, 46, 10);
  953. litest_touch_move_to(dev, 0, 46, 46, 50, 50, 10);
  954. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  955. litest_button_click(dev, BTN_LEFT, true);
  956. litest_drain_events(li);
  957. litest_touch_move_to(dev, 0, 50, 50, 50 + dist, 50 + dist, 10);
  958. litest_touch_move_to(dev, 0, 50 + dist, 50 + dist, 50, 50, 10);
  959. litest_touch_move_to(dev, 0, 50, 50, 50 - dist, 50 - dist, 10);
  960. litest_assert_empty_queue(li);
  961. litest_button_click(dev, BTN_LEFT, false);
  962. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  963. /* still pinned after release */
  964. litest_touch_move_to(dev, 0, 50, 50, 50 + dist, 50 + dist, 10);
  965. litest_touch_move_to(dev, 0, 50 + dist, 50 + dist, 50, 50, 10);
  966. litest_touch_move_to(dev, 0, 50, 50, 50 - dist, 50 - dist, 10);
  967. litest_assert_empty_queue(li);
  968. /* move to unpin */
  969. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  970. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  971. }
  972. END_TEST
  973. START_TEST(clickpad_softbutton_left)
  974. {
  975. struct litest_device *dev = litest_current_device();
  976. struct libinput *li = dev->libinput;
  977. litest_drain_events(li);
  978. litest_touch_down(dev, 0, 10, 90);
  979. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  980. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  981. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  982. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  983. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  984. litest_touch_up(dev, 0);
  985. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  986. litest_dispatch(li);
  987. litest_assert_empty_queue(li);
  988. }
  989. END_TEST
  990. START_TEST(clickpad_softbutton_middle)
  991. {
  992. struct litest_device *dev = litest_current_device();
  993. struct libinput *li = dev->libinput;
  994. litest_drain_events(li);
  995. litest_touch_down(dev, 0, 50, 90);
  996. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  997. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  998. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  999. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1000. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1001. litest_touch_up(dev, 0);
  1002. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  1003. litest_dispatch(li);
  1004. litest_assert_empty_queue(li);
  1005. }
  1006. END_TEST
  1007. START_TEST(clickpad_softbutton_right)
  1008. {
  1009. struct litest_device *dev = litest_current_device();
  1010. struct libinput *li = dev->libinput;
  1011. litest_drain_events(li);
  1012. litest_touch_down(dev, 0, 90, 90);
  1013. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1014. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1015. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1016. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1017. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1018. litest_touch_up(dev, 0);
  1019. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1020. litest_dispatch(li);
  1021. litest_assert_empty_queue(li);
  1022. }
  1023. END_TEST
  1024. START_TEST(clickpad_softbutton_left_tap_n_drag)
  1025. {
  1026. struct litest_device *dev = litest_current_device();
  1027. struct libinput *li = dev->libinput;
  1028. litest_enable_tap(dev->libinput_device);
  1029. litest_drain_events(li);
  1030. /* Tap in left button area, then finger down, button click
  1031. -> expect left button press/release and left button press
  1032. Release button, finger up
  1033. -> expect right button release
  1034. */
  1035. litest_touch_down(dev, 0, 20, 90);
  1036. litest_touch_up(dev, 0);
  1037. litest_touch_down(dev, 0, 20, 90);
  1038. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1039. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1040. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1041. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1042. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1043. litest_assert_empty_queue(li);
  1044. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1045. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1046. litest_touch_up(dev, 0);
  1047. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1048. litest_assert_empty_queue(li);
  1049. }
  1050. END_TEST
  1051. START_TEST(clickpad_softbutton_right_tap_n_drag)
  1052. {
  1053. struct litest_device *dev = litest_current_device();
  1054. struct libinput *li = dev->libinput;
  1055. litest_enable_tap(dev->libinput_device);
  1056. litest_drain_events(li);
  1057. /* Tap in right button area, then finger down, button click
  1058. -> expect left button press/release and right button press
  1059. Release button, finger up
  1060. -> expect right button release
  1061. */
  1062. litest_touch_down(dev, 0, 90, 90);
  1063. litest_touch_up(dev, 0);
  1064. litest_touch_down(dev, 0, 90, 90);
  1065. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1066. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1067. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1068. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1069. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1070. litest_assert_empty_queue(li);
  1071. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1072. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1073. litest_touch_up(dev, 0);
  1074. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1075. litest_assert_empty_queue(li);
  1076. }
  1077. END_TEST
  1078. START_TEST(clickpad_softbutton_left_1st_fg_move)
  1079. {
  1080. struct litest_device *dev = litest_current_device();
  1081. struct libinput *li = dev->libinput;
  1082. struct libinput_event *event;
  1083. double x = 0, y = 0;
  1084. int nevents = 0;
  1085. litest_drain_events(li);
  1086. /* One finger down in the left button area, button press
  1087. -> expect a button event
  1088. Move finger up out of the area, wait for timeout
  1089. Move finger around diagonally down left
  1090. -> expect motion events down left
  1091. Release finger
  1092. -> expect a button event */
  1093. /* finger down, press in left button */
  1094. litest_touch_down(dev, 0, 20, 90);
  1095. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1096. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1097. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1098. litest_assert_empty_queue(li);
  1099. /* move out of the area, then wait for softbutton timer */
  1100. litest_touch_move_to(dev, 0, 20, 90, 50, 50, 20);
  1101. litest_timeout_softbuttons(li);
  1102. litest_drain_events(li);
  1103. /* move down left, expect motion */
  1104. litest_touch_move_to(dev, 0, 50, 50, 20, 90, 20);
  1105. litest_dispatch(li);
  1106. event = libinput_get_event(li);
  1107. litest_assert_notnull(event);
  1108. while (event) {
  1109. struct libinput_event_pointer *p;
  1110. litest_assert_event_type(event, LIBINPUT_EVENT_POINTER_MOTION);
  1111. p = libinput_event_get_pointer_event(event);
  1112. /* we moved up/right, now down/left so the pointer accel
  1113. code may lag behind with the dx/dy vectors. Hence, add up
  1114. the x/y movements and expect that on average we moved
  1115. left and down */
  1116. x += libinput_event_pointer_get_dx(p);
  1117. y += libinput_event_pointer_get_dy(p);
  1118. nevents++;
  1119. libinput_event_destroy(event);
  1120. litest_dispatch(li);
  1121. event = libinput_get_event(li);
  1122. }
  1123. litest_assert(x / nevents < 0);
  1124. litest_assert(y / nevents > 0);
  1125. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1126. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1127. litest_touch_up(dev, 0);
  1128. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1129. litest_assert_empty_queue(li);
  1130. }
  1131. END_TEST
  1132. START_TEST(clickpad_softbutton_left_2nd_fg_move)
  1133. {
  1134. struct litest_device *dev = litest_current_device();
  1135. struct libinput *li = dev->libinput;
  1136. struct libinput_event *event;
  1137. litest_drain_events(li);
  1138. /* One finger down in the left button area, button press
  1139. -> expect a button event
  1140. Put a second finger down in the area, move it right, release
  1141. -> expect motion events right
  1142. Put a second finger down in the area, move it down, release
  1143. -> expect motion events down
  1144. Release second finger, release first finger
  1145. -> expect a button event */
  1146. litest_touch_down(dev, 0, 20, 90);
  1147. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1148. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1149. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1150. litest_assert_empty_queue(li);
  1151. litest_touch_down(dev, 1, 20, 20);
  1152. litest_touch_move_to(dev, 1, 20, 20, 80, 20, 25);
  1153. litest_dispatch(li);
  1154. event = libinput_get_event(li);
  1155. litest_assert_notnull(event);
  1156. while (event) {
  1157. struct libinput_event_pointer *p;
  1158. double x, y;
  1159. litest_assert_event_type(event, LIBINPUT_EVENT_POINTER_MOTION);
  1160. p = libinput_event_get_pointer_event(event);
  1161. x = libinput_event_pointer_get_dx(p);
  1162. y = libinput_event_pointer_get_dy(p);
  1163. /* Ignore events only containing an unaccelerated motion
  1164. * vector. */
  1165. if (x != 0 || y != 0) {
  1166. litest_assert(x > 0);
  1167. litest_assert(y == 0);
  1168. }
  1169. libinput_event_destroy(event);
  1170. litest_dispatch(li);
  1171. event = libinput_get_event(li);
  1172. }
  1173. litest_touch_up(dev, 1);
  1174. /* second finger down */
  1175. litest_touch_down(dev, 1, 20, 20);
  1176. litest_touch_move_to(dev, 1, 20, 20, 20, 80, 15);
  1177. litest_dispatch(li);
  1178. event = libinput_get_event(li);
  1179. litest_assert_notnull(event);
  1180. while (event) {
  1181. struct libinput_event_pointer *p;
  1182. double x, y;
  1183. litest_assert_event_type(event, LIBINPUT_EVENT_POINTER_MOTION);
  1184. p = libinput_event_get_pointer_event(event);
  1185. x = libinput_event_pointer_get_dx(p);
  1186. y = libinput_event_pointer_get_dy(p);
  1187. litest_assert(x == 0);
  1188. litest_assert(y > 0);
  1189. libinput_event_destroy(event);
  1190. litest_dispatch(li);
  1191. event = libinput_get_event(li);
  1192. }
  1193. litest_touch_up(dev, 1);
  1194. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1195. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1196. litest_touch_up(dev, 0);
  1197. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1198. litest_assert_empty_queue(li);
  1199. }
  1200. END_TEST
  1201. START_TEST(clickpad_softbutton_left_to_right)
  1202. {
  1203. struct litest_device *dev = litest_current_device();
  1204. struct libinput *li = dev->libinput;
  1205. litest_drain_events(li);
  1206. /* One finger down in left software button area,
  1207. move to right button area immediately, click
  1208. -> expect right button event
  1209. */
  1210. litest_touch_down(dev, 0, 30, 90);
  1211. litest_touch_move_to(dev, 0, 30, 90, 90, 90, 25);
  1212. litest_drain_events(li);
  1213. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1214. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1215. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1216. litest_assert_empty_queue(li);
  1217. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1218. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1219. litest_touch_up(dev, 0);
  1220. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1221. litest_assert_empty_queue(li);
  1222. }
  1223. END_TEST
  1224. START_TEST(clickpad_softbutton_right_to_left)
  1225. {
  1226. struct litest_device *dev = litest_current_device();
  1227. struct libinput *li = dev->libinput;
  1228. litest_drain_events(li);
  1229. /* One finger down in right software button area,
  1230. move to left button area immediately, click
  1231. -> expect left button event
  1232. */
  1233. litest_touch_down(dev, 0, 80, 90);
  1234. litest_touch_move_to(dev, 0, 80, 90, 30, 90, 25);
  1235. litest_drain_events(li);
  1236. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1237. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1238. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1239. litest_assert_empty_queue(li);
  1240. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1241. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1242. litest_touch_up(dev, 0);
  1243. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1244. litest_assert_empty_queue(li);
  1245. }
  1246. END_TEST
  1247. START_TEST(clickpad_softbutton_hover_into_buttons)
  1248. {
  1249. struct litest_device *dev = litest_current_device();
  1250. struct libinput *li = dev->libinput;
  1251. litest_drain_events(li);
  1252. litest_hover_start(dev, 0, 50, 50);
  1253. litest_dispatch(li);
  1254. litest_hover_move_to(dev, 0, 50, 50, 90, 90, 20);
  1255. litest_dispatch(li);
  1256. litest_touch_move_to(dev, 0, 90, 90, 91, 91, 1);
  1257. litest_button_click(dev, BTN_LEFT, true);
  1258. litest_dispatch(li);
  1259. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1260. litest_assert_empty_queue(li);
  1261. litest_button_click(dev, BTN_LEFT, false);
  1262. litest_touch_up(dev, 0);
  1263. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1264. }
  1265. END_TEST
  1266. START_TEST(clickpad_topsoftbuttons_left)
  1267. {
  1268. struct litest_device *dev = litest_current_device();
  1269. struct libinput *li = dev->libinput;
  1270. litest_drain_events(li);
  1271. litest_touch_down(dev, 0, 10, 5);
  1272. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1273. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1274. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1275. litest_assert_empty_queue(li);
  1276. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1277. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1278. litest_touch_up(dev, 0);
  1279. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1280. litest_assert_empty_queue(li);
  1281. }
  1282. END_TEST
  1283. START_TEST(clickpad_topsoftbuttons_right)
  1284. {
  1285. struct litest_device *dev = litest_current_device();
  1286. struct libinput *li = dev->libinput;
  1287. litest_drain_events(li);
  1288. litest_touch_down(dev, 0, 90, 5);
  1289. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1290. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1291. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1292. litest_assert_empty_queue(li);
  1293. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1294. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1295. litest_touch_up(dev, 0);
  1296. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1297. litest_assert_empty_queue(li);
  1298. }
  1299. END_TEST
  1300. START_TEST(clickpad_topsoftbuttons_middle)
  1301. {
  1302. struct litest_device *dev = litest_current_device();
  1303. struct libinput *li = dev->libinput;
  1304. litest_drain_events(li);
  1305. litest_touch_down(dev, 0, 50, 5);
  1306. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1307. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1308. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  1309. litest_assert_empty_queue(li);
  1310. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1311. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1312. litest_touch_up(dev, 0);
  1313. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  1314. litest_assert_empty_queue(li);
  1315. }
  1316. END_TEST
  1317. START_TEST(clickpad_topsoftbuttons_move_out_leftclick_before_timeout)
  1318. {
  1319. struct litest_device *dev = litest_current_device();
  1320. struct libinput *li = dev->libinput;
  1321. /* Finger down in top right button area, wait past enter timeout
  1322. Move into main area, wait past leave timeout
  1323. Click
  1324. -> expect left click
  1325. */
  1326. litest_drain_events(li);
  1327. litest_touch_down(dev, 0, 80, 5);
  1328. litest_timeout_softbuttons(li);
  1329. litest_assert_empty_queue(li);
  1330. litest_touch_move_to(dev, 0, 80, 5, 80, 90, 20);
  1331. litest_dispatch(li);
  1332. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1333. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1334. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1335. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1336. litest_touch_up(dev, 0);
  1337. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1338. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1339. }
  1340. END_TEST
  1341. START_TEST(clickpad_topsoftbuttons_move_out_leftclick)
  1342. {
  1343. struct litest_device *dev = litest_current_device();
  1344. struct libinput *li = dev->libinput;
  1345. /* Finger down in top right button area, wait past enter timeout
  1346. Move into main area, wait past leave timeout
  1347. Click
  1348. -> expect left click
  1349. */
  1350. litest_drain_events(li);
  1351. litest_touch_down(dev, 0, 80, 5);
  1352. litest_timeout_softbuttons(li);
  1353. litest_assert_empty_queue(li);
  1354. litest_touch_move_to(dev, 0, 80, 5, 80, 90, 20);
  1355. litest_timeout_softbuttons(li);
  1356. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1357. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1358. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1359. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1360. litest_touch_up(dev, 0);
  1361. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1362. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1363. }
  1364. END_TEST
  1365. START_TEST(clickpad_topsoftbuttons_clickfinger)
  1366. {
  1367. struct litest_device *dev = litest_current_device();
  1368. struct libinput *li = dev->libinput;
  1369. litest_enable_clickfinger(dev);
  1370. litest_drain_events(li);
  1371. litest_touch_down(dev, 0, 90, 5);
  1372. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1373. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1374. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1375. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1376. litest_touch_up(dev, 0);
  1377. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1378. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1379. litest_assert_empty_queue(li);
  1380. litest_touch_down(dev, 0, 90, 5);
  1381. litest_touch_down(dev, 1, 80, 5);
  1382. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1383. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1384. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1385. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1386. litest_touch_up(dev, 0);
  1387. litest_touch_up(dev, 1);
  1388. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1389. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1390. }
  1391. END_TEST
  1392. START_TEST(clickpad_topsoftbuttons_clickfinger_dev_disabled)
  1393. {
  1394. struct litest_device *dev = litest_current_device();
  1395. struct libinput *li = dev->libinput;
  1396. struct litest_device *trackpoint = litest_add_device(li, LITEST_TRACKPOINT);
  1397. libinput_device_config_send_events_set_mode(
  1398. dev->libinput_device,
  1399. LIBINPUT_CONFIG_SEND_EVENTS_DISABLED);
  1400. litest_enable_clickfinger(dev);
  1401. litest_drain_events(li);
  1402. litest_touch_down(dev, 0, 90, 5);
  1403. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1404. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1405. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1406. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1407. litest_touch_up(dev, 0);
  1408. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1409. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1410. litest_assert_empty_queue(li);
  1411. litest_touch_down(dev, 0, 90, 5);
  1412. litest_touch_down(dev, 1, 10, 5);
  1413. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1414. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1415. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1416. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1417. litest_touch_up(dev, 0);
  1418. litest_touch_up(dev, 1);
  1419. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  1420. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  1421. litest_device_destroy(trackpoint);
  1422. }
  1423. END_TEST
  1424. START_TEST(clickpad_middleemulation_config_delayed)
  1425. {
  1426. struct litest_device *dev = litest_current_device();
  1427. struct libinput_device *device = dev->libinput_device;
  1428. struct libinput *li = dev->libinput;
  1429. enum libinput_config_status status;
  1430. int enabled;
  1431. enabled = libinput_device_config_middle_emulation_get_enabled(device);
  1432. litest_assert(!enabled);
  1433. litest_touch_down(dev, 0, 30, 95);
  1434. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1435. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1436. litest_dispatch(li);
  1437. /* actual config is delayed, but status is immediate */
  1438. status = libinput_device_config_middle_emulation_set_enabled(
  1439. device,
  1440. LIBINPUT_CONFIG_MIDDLE_EMULATION_ENABLED);
  1441. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  1442. enabled = libinput_device_config_middle_emulation_get_enabled(device);
  1443. litest_assert(enabled);
  1444. status = libinput_device_config_middle_emulation_set_enabled(
  1445. device,
  1446. LIBINPUT_CONFIG_MIDDLE_EMULATION_DISABLED);
  1447. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  1448. enabled = libinput_device_config_middle_emulation_get_enabled(device);
  1449. litest_assert(!enabled);
  1450. }
  1451. END_TEST
  1452. START_TEST(clickpad_middleemulation_click)
  1453. {
  1454. struct litest_device *dev = litest_current_device();
  1455. struct libinput *li = dev->libinput;
  1456. litest_enable_buttonareas(dev);
  1457. litest_enable_middleemu(dev);
  1458. litest_drain_events(li);
  1459. litest_touch_down(dev, 0, 30, 95);
  1460. litest_touch_down(dev, 1, 80, 95);
  1461. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1462. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1463. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  1464. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1465. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1466. litest_touch_up(dev, 0);
  1467. litest_touch_up(dev, 1);
  1468. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  1469. litest_dispatch(li);
  1470. litest_assert_empty_queue(li);
  1471. }
  1472. END_TEST
  1473. START_TEST(clickpad_middleemulation_click_middle_left)
  1474. {
  1475. struct litest_device *dev = litest_current_device();
  1476. struct libinput *li = dev->libinput;
  1477. litest_enable_buttonareas(dev);
  1478. litest_enable_middleemu(dev);
  1479. litest_drain_events(li);
  1480. litest_touch_down(dev, 0, 49, 95);
  1481. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1482. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1483. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1484. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1485. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1486. litest_touch_up(dev, 0);
  1487. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1488. litest_dispatch(li);
  1489. litest_assert_empty_queue(li);
  1490. }
  1491. END_TEST
  1492. START_TEST(clickpad_middleemulation_click_middle_right)
  1493. {
  1494. struct litest_device *dev = litest_current_device();
  1495. struct libinput *li = dev->libinput;
  1496. litest_enable_buttonareas(dev);
  1497. litest_enable_middleemu(dev);
  1498. litest_drain_events(li);
  1499. litest_touch_down(dev, 0, 51, 95);
  1500. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1501. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1502. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1503. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1504. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1505. litest_touch_up(dev, 0);
  1506. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1507. litest_dispatch(li);
  1508. litest_assert_empty_queue(li);
  1509. }
  1510. END_TEST
  1511. START_TEST(clickpad_middleemulation_click_enable_while_down)
  1512. {
  1513. struct litest_device *dev = litest_current_device();
  1514. struct libinput *li = dev->libinput;
  1515. litest_enable_buttonareas(dev);
  1516. litest_drain_events(li);
  1517. litest_touch_down(dev, 0, 49, 95);
  1518. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1519. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1520. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  1521. litest_enable_middleemu(dev);
  1522. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1523. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1524. litest_touch_up(dev, 0);
  1525. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  1526. litest_dispatch(li);
  1527. litest_assert_empty_queue(li);
  1528. litest_touch_down(dev, 0, 49, 95);
  1529. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1530. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1531. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1532. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1533. litest_touch_up(dev, 0);
  1534. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1535. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1536. litest_dispatch(li);
  1537. }
  1538. END_TEST
  1539. START_TEST(clickpad_middleemulation_click_disable_while_down)
  1540. {
  1541. struct litest_device *dev = litest_current_device();
  1542. struct libinput *li = dev->libinput;
  1543. litest_enable_buttonareas(dev);
  1544. litest_enable_middleemu(dev);
  1545. litest_drain_events(li);
  1546. litest_touch_down(dev, 0, 30, 95);
  1547. litest_touch_down(dev, 1, 70, 95);
  1548. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1549. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1550. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  1551. litest_disable_middleemu(dev);
  1552. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1553. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1554. litest_touch_up(dev, 0);
  1555. litest_touch_up(dev, 1);
  1556. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  1557. litest_dispatch(li);
  1558. litest_assert_empty_queue(li);
  1559. litest_touch_down(dev, 0, 49, 95);
  1560. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  1561. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1562. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  1563. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1564. litest_touch_up(dev, 0);
  1565. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  1566. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  1567. litest_dispatch(li);
  1568. }
  1569. END_TEST
  1570. START_TEST(touchpad_non_clickpad_detection)
  1571. {
  1572. struct libinput_device *device;
  1573. struct libevdev_uinput *uinput;
  1574. static struct input_absinfo absinfo[] = {
  1575. { ABS_X, 1472, 5472, 0, 0, 75 },
  1576. { ABS_Y, 1408, 4448, 0, 0, 129 },
  1577. { ABS_PRESSURE, 0, 255, 0, 0, 0 },
  1578. { ABS_TOOL_WIDTH, 0, 15, 0, 0, 0 },
  1579. { ABS_MT_SLOT, 0, 1, 0, 0, 0 },
  1580. { ABS_MT_POSITION_X, 1472, 5472, 0, 0, 75 },
  1581. { ABS_MT_POSITION_Y, 1408, 4448, 0, 0, 129 },
  1582. { ABS_MT_TRACKING_ID, 0, 65535, 0, 0, 0 },
  1583. { ABS_MT_PRESSURE, 0, 255, 0, 0, 0 },
  1584. { .value = -1 }
  1585. };
  1586. uint32_t methods;
  1587. /* Create a touchpad with only a left button but missing
  1588. * INPUT_PROP_BUTTONPAD. We should treat this as clickpad.
  1589. */
  1590. /* clang-format off */
  1591. uinput = litest_create_uinput_abs_device("litest NonClickpad",
  1592. NULL,
  1593. absinfo,
  1594. EV_KEY, BTN_LEFT,
  1595. EV_KEY, BTN_TOOL_FINGER,
  1596. EV_KEY, BTN_TOUCH,
  1597. -1);
  1598. /* clang-format on */
  1599. _litest_context_destroy_ struct libinput *li = litest_create_context();
  1600. device = libinput_path_add_device(li, libevdev_uinput_get_devnode(uinput));
  1601. methods = libinput_device_config_click_get_methods(device);
  1602. litest_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  1603. litest_assert(methods & LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  1604. libinput_path_remove_device(device);
  1605. libevdev_uinput_destroy(uinput);
  1606. }
  1607. END_TEST
  1608. TEST_COLLECTION(touchpad_buttons)
  1609. {
  1610. /* clang-format off */
  1611. litest_add(touchpad_button, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  1612. litest_add(touchpad_1fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
  1613. litest_add(touchpad_1fg_clickfinger_no_touch, LITEST_CLICKPAD, LITEST_ANY);
  1614. litest_with_parameters(params, "map", 'I', 2, litest_named_i32(LIBINPUT_CONFIG_CLICKFINGER_MAP_LRM, "LRM"),
  1615. litest_named_i32(LIBINPUT_CONFIG_CLICKFINGER_MAP_LMR, "LMR")) {
  1616. litest_add_parametrized(touchpad_2fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY, params);
  1617. litest_add_parametrized(touchpad_3fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY, params);
  1618. litest_add_parametrized(touchpad_3fg_clickfinger_btntool, LITEST_CLICKPAD, LITEST_ANY, params);
  1619. litest_add_parametrized(touchpad_2fg_clickfinger_distance, LITEST_CLICKPAD, LITEST_ANY, params);
  1620. litest_add_parametrized(touchpad_3fg_clickfinger_distance, LITEST_CLICKPAD, LITEST_ANY, params);
  1621. litest_add_parametrized(touchpad_3fg_clickfinger_distance_btntool, LITEST_CLICKPAD, LITEST_ANY, params);
  1622. }
  1623. litest_add_for_device(touchpad_2fg_clickfinger_bottom, LITEST_SYNAPTICS_TOPBUTTONPAD);
  1624. litest_add(touchpad_4fg_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
  1625. litest_add(touchpad_4fg_clickfinger_btntool_2slots, LITEST_CLICKPAD, LITEST_ANY);
  1626. litest_add(touchpad_4fg_clickfinger_btntool_3slots, LITEST_CLICKPAD, LITEST_ANY);
  1627. litest_add(touchpad_clickfinger_to_area_method, LITEST_CLICKPAD, LITEST_ANY);
  1628. litest_add(touchpad_clickfinger_to_area_method_while_down, LITEST_CLICKPAD, LITEST_ANY);
  1629. litest_add(touchpad_area_to_clickfinger_method, LITEST_CLICKPAD, LITEST_ANY);
  1630. litest_add(touchpad_area_to_clickfinger_method_while_down, LITEST_CLICKPAD, LITEST_ANY);
  1631. /* run those two for the T440 one only so we don't have to worry
  1632. * about small touchpads messing with thumb detection expectations */
  1633. litest_add_for_device(touchpad_clickfinger_3fg_tool_position, LITEST_SYNAPTICS_TOPBUTTONPAD);
  1634. litest_add_for_device(touchpad_clickfinger_4fg_tool_position, LITEST_SYNAPTICS_TOPBUTTONPAD);
  1635. litest_add_for_device(touchpad_clickfinger_appletouch_config, LITEST_APPLETOUCH);
  1636. litest_add_for_device(touchpad_clickfinger_appletouch_1fg, LITEST_APPLETOUCH);
  1637. litest_add_for_device(touchpad_clickfinger_appletouch_2fg, LITEST_APPLETOUCH);
  1638. litest_add_for_device(touchpad_clickfinger_appletouch_3fg, LITEST_APPLETOUCH);
  1639. litest_add_for_device(touchpad_1fg_clickfinger_no_touch_phantomclicks, LITEST_SYNAPTICS_PHANTOMCLICKS);
  1640. litest_with_parameters(params, "fingers", 'i', 3, 1, 2, 3) {
  1641. litest_add_parametrized(touchpad_clickfinger_click_drag, LITEST_CLICKPAD, LITEST_ANY, params);
  1642. }
  1643. litest_add(touchpad_click_defaults_clickfinger, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  1644. litest_add(touchpad_click_default_clickfinger_map, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  1645. litest_add(touchpad_click_set_clickfinger_map, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  1646. litest_add(touchpad_click_defaults_btnarea, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1647. litest_add(touchpad_click_defaults_none, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  1648. litest_add(touchpad_click_defaults_none, LITEST_ANY, LITEST_TOUCHPAD);
  1649. litest_add(touchpad_btn_left, LITEST_TOUCHPAD|LITEST_BUTTON, LITEST_CLICKPAD);
  1650. litest_add(clickpad_btn_left, LITEST_CLICKPAD, LITEST_ANY);
  1651. litest_add(clickpad_click_n_drag, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH);
  1652. litest_add(clickpad_finger_pin, LITEST_CLICKPAD, LITEST_ANY);
  1653. litest_add(clickpad_softbutton_left, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1654. litest_add(clickpad_softbutton_middle, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1655. litest_add(clickpad_softbutton_right, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1656. litest_add(clickpad_softbutton_left_tap_n_drag, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1657. litest_add(clickpad_softbutton_right_tap_n_drag, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1658. litest_add(clickpad_softbutton_left_1st_fg_move, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1659. litest_add(clickpad_softbutton_left_2nd_fg_move, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1660. litest_add(clickpad_softbutton_left_to_right, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1661. litest_add(clickpad_softbutton_right_to_left, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  1662. litest_add(clickpad_softbutton_hover_into_buttons, LITEST_CLICKPAD|LITEST_HOVER, LITEST_APPLE_CLICKPAD);
  1663. litest_add(clickpad_topsoftbuttons_left, LITEST_TOPBUTTONPAD, LITEST_ANY);
  1664. litest_add(clickpad_topsoftbuttons_right, LITEST_TOPBUTTONPAD, LITEST_ANY);
  1665. litest_add(clickpad_topsoftbuttons_middle, LITEST_TOPBUTTONPAD, LITEST_ANY);
  1666. litest_add(clickpad_topsoftbuttons_move_out_leftclick, LITEST_TOPBUTTONPAD, LITEST_ANY);
  1667. litest_add(clickpad_topsoftbuttons_move_out_leftclick_before_timeout, LITEST_TOPBUTTONPAD, LITEST_ANY);
  1668. litest_add(clickpad_topsoftbuttons_clickfinger, LITEST_TOPBUTTONPAD, LITEST_ANY);
  1669. litest_add(clickpad_topsoftbuttons_clickfinger_dev_disabled, LITEST_TOPBUTTONPAD, LITEST_ANY);
  1670. litest_add(clickpad_middleemulation_config_delayed, LITEST_CLICKPAD, LITEST_ANY);
  1671. litest_add(clickpad_middleemulation_click, LITEST_CLICKPAD, LITEST_ANY);
  1672. litest_add(clickpad_middleemulation_click_middle_left, LITEST_CLICKPAD, LITEST_ANY);
  1673. litest_add(clickpad_middleemulation_click_middle_right, LITEST_CLICKPAD, LITEST_ANY);
  1674. litest_add(clickpad_middleemulation_click_enable_while_down, LITEST_CLICKPAD, LITEST_ANY);
  1675. litest_add(clickpad_middleemulation_click_disable_while_down, LITEST_CLICKPAD, LITEST_ANY);
  1676. litest_add_no_device(touchpad_non_clickpad_detection);
  1677. /* clang-format on */
  1678. }