1
0

test-touchpad.c 229 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746
  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. static inline bool
  31. has_disable_while_typing(struct litest_device *device)
  32. {
  33. return libinput_device_config_dwt_is_available(device->libinput_device);
  34. }
  35. static inline struct litest_device *
  36. dwt_init_paired_keyboard(struct libinput *li, struct litest_device *touchpad)
  37. {
  38. enum litest_device_type which = LITEST_KEYBOARD;
  39. if (libevdev_get_id_vendor(touchpad->evdev) == VENDOR_ID_APPLE)
  40. which = LITEST_APPLE_KEYBOARD;
  41. if (libevdev_get_id_vendor(touchpad->evdev) == VENDOR_ID_CHICONY)
  42. which = LITEST_ACER_HAWAII_KEYBOARD;
  43. if (libevdev_get_id_vendor(touchpad->evdev) == VENDOR_ID_GENERIC)
  44. which = LITEST_GENERIC_USBCOMBO_KEYBOARD;
  45. return litest_add_device(li, which);
  46. }
  47. START_TEST(touchpad_1fg_motion)
  48. {
  49. struct litest_device *dev = litest_current_device();
  50. struct libinput *li = dev->libinput;
  51. struct libinput_event *event;
  52. litest_disable_tap(dev->libinput_device);
  53. litest_disable_hold_gestures(dev->libinput_device);
  54. litest_drain_events(li);
  55. litest_touch_down(dev, 0, 50, 50);
  56. litest_touch_move_to(dev, 0, 50, 50, 80, 50, 20);
  57. litest_touch_up(dev, 0);
  58. litest_dispatch(li);
  59. event = libinput_get_event(li);
  60. litest_assert_notnull(event);
  61. while (event) {
  62. struct libinput_event_pointer *ptrev;
  63. ptrev = litest_is_motion_event(event);
  64. litest_assert_double_ge(libinput_event_pointer_get_dx(ptrev), 0);
  65. litest_assert_double_eq(libinput_event_pointer_get_dy(ptrev), 0);
  66. libinput_event_destroy(event);
  67. event = libinput_get_event(li);
  68. }
  69. }
  70. END_TEST
  71. START_TEST(touchpad_2fg_no_motion)
  72. {
  73. struct litest_device *dev = litest_current_device();
  74. struct libinput *li = dev->libinput;
  75. struct libinput_event *event;
  76. libinput_device_config_tap_set_enabled(dev->libinput_device,
  77. LIBINPUT_CONFIG_TAP_DISABLED);
  78. litest_drain_events(li);
  79. litest_touch_down(dev, 0, 20, 20);
  80. litest_touch_down(dev, 1, 70, 20);
  81. litest_touch_move_two_touches(dev, 20, 20, 70, 20, 20, 30, 20);
  82. litest_touch_up(dev, 1);
  83. litest_touch_up(dev, 0);
  84. litest_dispatch(li);
  85. event = libinput_get_event(li);
  86. while (event) {
  87. litest_assert_enum_ne(libinput_event_get_type(event),
  88. LIBINPUT_EVENT_POINTER_MOTION);
  89. libinput_event_destroy(event);
  90. event = libinput_get_event(li);
  91. }
  92. }
  93. END_TEST
  94. static void
  95. test_2fg_scroll(struct litest_device *dev, double dx, double dy, bool want_sleep)
  96. {
  97. struct libinput *li = dev->libinput;
  98. litest_touch_down(dev, 0, 49, 50);
  99. litest_touch_down(dev, 1, 51, 50);
  100. litest_touch_move_two_touches(dev, 49, 50, 51, 50, dx, dy, 10);
  101. /* Avoid a small scroll being seen as a tap */
  102. if (want_sleep) {
  103. litest_timeout_tap(li);
  104. }
  105. litest_touch_up(dev, 1);
  106. litest_touch_up(dev, 0);
  107. litest_dispatch(li);
  108. }
  109. START_TEST(touchpad_2fg_scroll)
  110. {
  111. struct litest_device *dev = litest_current_device();
  112. struct libinput *li = dev->libinput;
  113. if (!litest_has_2fg_scroll(dev))
  114. return LITEST_NOT_APPLICABLE;
  115. litest_enable_2fg_scroll(dev);
  116. litest_disable_hold_gestures(dev->libinput_device);
  117. litest_drain_events(li);
  118. test_2fg_scroll(dev, 0.1, 40, false);
  119. litest_assert_scroll(li,
  120. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  121. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  122. 9);
  123. test_2fg_scroll(dev, 0.1, -40, false);
  124. litest_assert_scroll(li,
  125. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  126. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  127. -9);
  128. test_2fg_scroll(dev, 40, 0.1, false);
  129. litest_assert_scroll(li,
  130. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  131. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  132. 9);
  133. test_2fg_scroll(dev, -40, 0.1, false);
  134. litest_assert_scroll(li,
  135. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  136. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  137. -9);
  138. /* 2fg scroll smaller than the threshold should not generate events */
  139. test_2fg_scroll(dev, 0.1, 0.1, true);
  140. litest_assert_empty_queue(li);
  141. }
  142. END_TEST
  143. START_TEST(touchpad_2fg_scroll_initially_diagonal)
  144. {
  145. struct litest_device *dev = litest_current_device();
  146. struct libinput *li = dev->libinput;
  147. struct libinput_event *event;
  148. int i;
  149. int expected_nevents;
  150. double w, h;
  151. double ratio;
  152. double ydelta;
  153. if (!litest_has_2fg_scroll(dev))
  154. return LITEST_NOT_APPLICABLE;
  155. litest_assert_int_eq(libinput_device_get_size(dev->libinput_device, &w, &h), 0);
  156. ratio = w / h;
  157. litest_enable_2fg_scroll(dev);
  158. litest_drain_events(li);
  159. litest_touch_down(dev, 0, 45, 30);
  160. litest_touch_down(dev, 1, 55, 30);
  161. /* start diagonally */
  162. ydelta = 15 * ratio;
  163. litest_touch_move_two_touches(dev, 45, 30, 55, 30, 15, ydelta, 10);
  164. litest_dispatch(li);
  165. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  166. litest_drain_events(li);
  167. /* get rid of any touch history still adding x deltas sideways */
  168. for (i = 0; i < 5; i++)
  169. litest_touch_move(dev, 0, 60, 30 + ydelta + (i * ratio));
  170. litest_drain_events(li);
  171. /* scroll vertical only and make sure the horiz axis is never set */
  172. expected_nevents = 0;
  173. for (i = 6; i < 15; i++) {
  174. litest_touch_move(dev, 0, 60, 30 + ydelta + i * ratio);
  175. expected_nevents++;
  176. }
  177. /* both high-resolution and low-resolution events are generated */
  178. expected_nevents *= 2;
  179. litest_dispatch(li);
  180. event = libinput_get_event(li);
  181. do {
  182. struct libinput_event_pointer *ptrev;
  183. ptrev = litest_is_axis_event(event,
  184. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  185. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  186. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  187. litest_assert(!libinput_event_pointer_has_axis(
  188. ptrev,
  189. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL));
  190. libinput_event_destroy(event);
  191. event = libinput_get_event(li);
  192. expected_nevents--;
  193. } while (event);
  194. litest_assert_int_eq(expected_nevents, 0);
  195. litest_touch_up(dev, 1);
  196. litest_touch_up(dev, 0);
  197. litest_dispatch(li);
  198. }
  199. END_TEST
  200. static bool
  201. is_single_axis_2fg_scroll(struct litest_device *dev, enum libinput_pointer_axis axis)
  202. {
  203. struct libinput *li = dev->libinput;
  204. struct libinput_event *event;
  205. struct libinput_event_pointer *ptrev;
  206. enum libinput_pointer_axis on_axis = axis;
  207. enum libinput_pointer_axis off_axis =
  208. (axis == LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL)
  209. ? LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL
  210. : LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
  211. bool has_on_axis, has_off_axis;
  212. bool val = true;
  213. event = libinput_get_event(li);
  214. while (event) {
  215. ptrev = litest_is_axis_event(event,
  216. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  217. on_axis,
  218. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  219. has_on_axis = libinput_event_pointer_has_axis(ptrev, on_axis);
  220. has_off_axis = libinput_event_pointer_has_axis(ptrev, off_axis);
  221. if (has_on_axis && has_off_axis) {
  222. val = (litest_event_pointer_get_value(ptrev, off_axis) == 0.0);
  223. /* There must be an extra low/high-resolution event with
  224. * the same axis value (0.0). */
  225. libinput_event_destroy(event);
  226. event = libinput_get_event(li);
  227. litest_assert_notnull(event);
  228. ptrev = litest_is_axis_event(
  229. event,
  230. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  231. on_axis,
  232. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  233. litest_assert(val == (litest_event_pointer_get_value(
  234. ptrev,
  235. off_axis) == 0.0));
  236. break;
  237. }
  238. litest_assert(has_on_axis);
  239. litest_assert(!has_off_axis);
  240. libinput_event_destroy(event);
  241. event = libinput_get_event(li);
  242. }
  243. libinput_event_destroy(event);
  244. return val;
  245. }
  246. START_TEST(touchpad_2fg_scroll_axis_lock)
  247. {
  248. struct litest_device *dev = litest_current_device();
  249. struct libinput *li = dev->libinput;
  250. enum libinput_pointer_axis axis;
  251. double delta[4][2] = {
  252. { 7, 40 },
  253. { 7, -40 },
  254. { -7, 40 },
  255. { -7, -40 },
  256. };
  257. /* 10 degrees off from horiz/vert should count as straight */
  258. if (!litest_has_2fg_scroll(dev))
  259. return LITEST_NOT_APPLICABLE;
  260. litest_enable_2fg_scroll(dev);
  261. litest_drain_events(li);
  262. axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
  263. for (int i = 0; i < 4; i++) {
  264. test_2fg_scroll(dev, delta[i][0], delta[i][1], false);
  265. litest_assert(is_single_axis_2fg_scroll(dev, axis));
  266. litest_assert_empty_queue(li);
  267. }
  268. axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
  269. for (int i = 0; i < 4; i++) {
  270. test_2fg_scroll(dev, delta[i][1], delta[i][0], false);
  271. litest_assert(is_single_axis_2fg_scroll(dev, axis));
  272. litest_assert_empty_queue(li);
  273. }
  274. }
  275. END_TEST
  276. START_TEST(touchpad_2fg_scroll_axis_lock_switch)
  277. {
  278. struct litest_device *dev = litest_current_device();
  279. struct libinput *li = dev->libinput;
  280. enum libinput_pointer_axis axis;
  281. if (!litest_has_2fg_scroll(dev))
  282. return LITEST_NOT_APPLICABLE;
  283. litest_enable_2fg_scroll(dev);
  284. litest_drain_events(li);
  285. litest_touch_down(dev, 0, 20, 20);
  286. litest_touch_down(dev, 1, 25, 20);
  287. /* Move roughly straight horizontally for >100ms to set axis lock */
  288. litest_touch_move_two_touches(dev, 20, 20, 25, 20, 55, 10, 15);
  289. litest_dispatch(li);
  290. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  291. axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
  292. litest_assert(is_single_axis_2fg_scroll(dev, axis));
  293. litest_drain_events(li);
  294. msleep(200);
  295. litest_dispatch(li);
  296. /* Move roughly vertically for >100ms to switch axis lock. This will
  297. * contain some horizontal movement while the lock changes; don't
  298. * check for single-axis yet
  299. */
  300. litest_touch_move_two_touches(dev, 75, 30, 80, 30, 2, 20, 15);
  301. litest_dispatch(li);
  302. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  303. litest_drain_events(li);
  304. /* Move some more, roughly vertically, and check new axis lock */
  305. litest_touch_move_two_touches(dev, 77, 50, 82, 50, 1, 40, 15);
  306. litest_dispatch(li);
  307. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  308. axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
  309. litest_assert(is_single_axis_2fg_scroll(dev, axis));
  310. litest_drain_events(li);
  311. /* Move in a clear diagonal direction to ensure the lock releases */
  312. litest_touch_move_two_touches(dev, 78, 90, 83, 90, -60, -60, 20);
  313. litest_dispatch(li);
  314. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  315. axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
  316. litest_assert(!is_single_axis_2fg_scroll(dev, axis));
  317. litest_touch_up(dev, 1);
  318. litest_touch_up(dev, 0);
  319. litest_dispatch(li);
  320. litest_drain_events(li);
  321. }
  322. END_TEST
  323. START_TEST(touchpad_2fg_scroll_slow_distance)
  324. {
  325. struct litest_device *dev = litest_current_device();
  326. struct libinput *li = dev->libinput;
  327. struct libinput_event *event;
  328. double width, height;
  329. double y_move = 100;
  330. bool last_hi_res_event_found, last_low_res_event_found;
  331. if (!litest_has_2fg_scroll(dev))
  332. return LITEST_NOT_APPLICABLE;
  333. last_hi_res_event_found = false;
  334. last_low_res_event_found = false;
  335. /* We want to move > 5 mm. */
  336. litest_assert_int_eq(
  337. libinput_device_get_size(dev->libinput_device, &width, &height),
  338. 0);
  339. y_move = 100.0 / height * 7;
  340. litest_enable_2fg_scroll(dev);
  341. litest_disable_hold_gestures(dev->libinput_device);
  342. litest_drain_events(li);
  343. litest_touch_down(dev, 0, 49, 50);
  344. litest_touch_down(dev, 1, 51, 50);
  345. litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, y_move, 100);
  346. litest_touch_up(dev, 1);
  347. litest_touch_up(dev, 0);
  348. litest_dispatch(li);
  349. event = libinput_get_event(li);
  350. litest_assert_notnull(event);
  351. while (event) {
  352. struct libinput_event_pointer *ptrev;
  353. double axisval;
  354. ptrev = litest_is_axis_event(event,
  355. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  356. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  357. 0);
  358. axisval = litest_event_pointer_get_value(
  359. ptrev,
  360. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
  361. if (litest_is_high_res_axis_event(event)) {
  362. litest_assert(!last_hi_res_event_found);
  363. if (axisval == 0)
  364. last_hi_res_event_found = true;
  365. } else {
  366. litest_assert(!last_low_res_event_found);
  367. if (axisval == 0)
  368. last_low_res_event_found = true;
  369. }
  370. litest_assert(axisval >= 0.0);
  371. /* this is to verify we test the right thing, if the value
  372. is greater than scroll.threshold we triggered the wrong
  373. condition */
  374. litest_assert(axisval < 5.0);
  375. libinput_event_destroy(event);
  376. event = libinput_get_event(li);
  377. }
  378. litest_assert(last_low_res_event_found);
  379. litest_assert(last_hi_res_event_found);
  380. litest_assert_empty_queue(li);
  381. libinput_event_destroy(event);
  382. }
  383. END_TEST
  384. START_TEST(touchpad_2fg_scroll_source)
  385. {
  386. struct litest_device *dev = litest_current_device();
  387. struct libinput *li = dev->libinput;
  388. struct libinput_event *event;
  389. if (!litest_has_2fg_scroll(dev))
  390. return LITEST_NOT_APPLICABLE;
  391. litest_enable_2fg_scroll(dev);
  392. litest_drain_events(li);
  393. test_2fg_scroll(dev, 0, 30, false);
  394. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  395. while ((event = libinput_get_event(li))) {
  396. litest_is_axis_event(event,
  397. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  398. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  399. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  400. libinput_event_destroy(event);
  401. }
  402. }
  403. END_TEST
  404. START_TEST(touchpad_2fg_scroll_semi_mt)
  405. {
  406. struct litest_device *dev = litest_current_device();
  407. struct libinput *li = dev->libinput;
  408. if (!litest_has_2fg_scroll(dev))
  409. return LITEST_NOT_APPLICABLE;
  410. litest_enable_2fg_scroll(dev);
  411. litest_drain_events(li);
  412. litest_touch_down(dev, 0, 20, 20);
  413. litest_touch_down(dev, 1, 30, 20);
  414. litest_dispatch(li);
  415. litest_touch_move_two_touches(dev, 20, 20, 30, 20, 30, 40, 10);
  416. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  417. }
  418. END_TEST
  419. START_TEST(touchpad_2fg_scroll_return_to_motion)
  420. {
  421. struct litest_device *dev = litest_current_device();
  422. struct libinput *li = dev->libinput;
  423. if (!litest_has_2fg_scroll(dev))
  424. return LITEST_NOT_APPLICABLE;
  425. litest_enable_2fg_scroll(dev);
  426. litest_drain_events(li);
  427. /* start with motion */
  428. litest_touch_down(dev, 0, 70, 70);
  429. litest_touch_move_to(dev, 0, 70, 70, 49, 50, 10);
  430. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  431. /* 2fg scroll */
  432. litest_touch_down(dev, 1, 51, 50);
  433. litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, 20, 5);
  434. litest_touch_up(dev, 1);
  435. litest_dispatch(li);
  436. litest_timeout_finger_switch(li);
  437. litest_dispatch(li);
  438. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  439. litest_touch_move_to(dev, 0, 49, 70, 49, 50, 10);
  440. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  441. /* back to 2fg scroll, lifting the other finger */
  442. litest_touch_down(dev, 1, 51, 50);
  443. litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, 20, 5);
  444. litest_touch_up(dev, 0);
  445. litest_dispatch(li);
  446. litest_timeout_finger_switch(li);
  447. litest_dispatch(li);
  448. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  449. /* move with second finger */
  450. litest_touch_move_to(dev, 1, 51, 70, 51, 50, 10);
  451. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  452. litest_touch_up(dev, 1);
  453. litest_assert_empty_queue(li);
  454. }
  455. END_TEST
  456. START_TEST(touchpad_2fg_scroll_from_btnareas)
  457. {
  458. struct litest_device *dev = litest_current_device();
  459. struct libinput *li = dev->libinput;
  460. if (!litest_has_2fg_scroll(dev) || !litest_has_btnareas(dev))
  461. return LITEST_NOT_APPLICABLE;
  462. litest_enable_2fg_scroll(dev);
  463. litest_enable_buttonareas(dev);
  464. litest_drain_events(li);
  465. litest_touch_down(dev, 0, 30, 95);
  466. litest_touch_down(dev, 1, 50, 95);
  467. litest_dispatch(li);
  468. /* First finger moves out of the area first but it's a scroll
  469. * motion, should not trigger POINTER_MOTION */
  470. for (int i = 0; i < 5; i++) {
  471. litest_touch_move(dev, 0, 30, 95 - i);
  472. }
  473. litest_dispatch(li);
  474. for (int i = 0; i < 20; i++) {
  475. litest_touch_move(dev, 0, 30, 90 - i);
  476. litest_touch_move(dev, 1, 50, 95 - i);
  477. }
  478. litest_dispatch(li);
  479. litest_touch_up(dev, 0);
  480. litest_touch_up(dev, 1);
  481. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  482. }
  483. END_TEST
  484. START_TEST(touchpad_scroll_natural_defaults)
  485. {
  486. struct litest_device *dev = litest_current_device();
  487. int enabled = libevdev_get_id_vendor(dev->evdev) == VENDOR_ID_APPLE;
  488. litest_assert_int_ge(
  489. libinput_device_config_scroll_has_natural_scroll(dev->libinput_device),
  490. 1);
  491. litest_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(
  492. dev->libinput_device),
  493. enabled);
  494. litest_assert_int_eq(
  495. libinput_device_config_scroll_get_default_natural_scroll_enabled(
  496. dev->libinput_device),
  497. enabled);
  498. }
  499. END_TEST
  500. START_TEST(touchpad_scroll_natural_enable_config)
  501. {
  502. struct litest_device *dev = litest_current_device();
  503. enum libinput_config_status status;
  504. status = libinput_device_config_scroll_set_natural_scroll_enabled(
  505. dev->libinput_device,
  506. 1);
  507. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  508. litest_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(
  509. dev->libinput_device),
  510. 1);
  511. status = libinput_device_config_scroll_set_natural_scroll_enabled(
  512. dev->libinput_device,
  513. 0);
  514. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  515. litest_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(
  516. dev->libinput_device),
  517. 0);
  518. }
  519. END_TEST
  520. START_TEST(touchpad_scroll_natural_2fg)
  521. {
  522. struct litest_device *dev = litest_current_device();
  523. struct libinput *li = dev->libinput;
  524. if (!litest_has_2fg_scroll(dev))
  525. return LITEST_NOT_APPLICABLE;
  526. litest_enable_2fg_scroll(dev);
  527. litest_drain_events(li);
  528. libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device,
  529. 1);
  530. test_2fg_scroll(dev, 0.1, 40, false);
  531. litest_assert_scroll(li,
  532. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  533. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  534. -9);
  535. test_2fg_scroll(dev, 0.1, -40, false);
  536. litest_assert_scroll(li,
  537. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  538. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  539. 9);
  540. test_2fg_scroll(dev, 40, 0.1, false);
  541. litest_assert_scroll(li,
  542. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  543. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  544. -9);
  545. test_2fg_scroll(dev, -40, 0.1, false);
  546. litest_assert_scroll(li,
  547. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  548. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  549. 9);
  550. }
  551. END_TEST
  552. START_TEST(touchpad_scroll_natural_edge)
  553. {
  554. struct litest_device *dev = litest_current_device();
  555. struct libinput *li = dev->libinput;
  556. litest_enable_edge_scroll(dev);
  557. litest_drain_events(li);
  558. libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device,
  559. 1);
  560. litest_touch_down(dev, 0, 99, 20);
  561. litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10);
  562. litest_touch_up(dev, 0);
  563. litest_dispatch(li);
  564. litest_assert_scroll(li,
  565. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  566. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  567. -4);
  568. litest_assert_empty_queue(li);
  569. litest_touch_down(dev, 0, 99, 80);
  570. litest_touch_move_to(dev, 0, 99, 80, 99, 20, 10);
  571. litest_touch_up(dev, 0);
  572. litest_dispatch(li);
  573. litest_assert_scroll(li,
  574. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  575. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  576. 4);
  577. litest_assert_empty_queue(li);
  578. }
  579. END_TEST
  580. START_TEST(touchpad_edge_scroll_vert)
  581. {
  582. struct litest_device *dev = litest_current_device();
  583. struct libinput *li = dev->libinput;
  584. litest_touch_down(dev, 0, 99, 20);
  585. litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10);
  586. litest_touch_up(dev, 0);
  587. litest_drain_events(li);
  588. litest_enable_edge_scroll(dev);
  589. litest_touch_down(dev, 0, 99, 20);
  590. litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10);
  591. litest_touch_up(dev, 0);
  592. litest_dispatch(li);
  593. litest_assert_scroll(li,
  594. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  595. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  596. 4);
  597. litest_assert_empty_queue(li);
  598. litest_touch_down(dev, 0, 99, 80);
  599. litest_touch_move_to(dev, 0, 99, 80, 99, 20, 10);
  600. litest_touch_up(dev, 0);
  601. litest_dispatch(li);
  602. litest_assert_scroll(li,
  603. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  604. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  605. -4);
  606. litest_assert_empty_queue(li);
  607. }
  608. END_TEST
  609. static int
  610. touchpad_has_horiz_edge_scroll_size(struct litest_device *dev)
  611. {
  612. double width, height;
  613. int rc;
  614. rc = libinput_device_get_size(dev->libinput_device, &width, &height);
  615. return rc == 0 && height >= 40;
  616. }
  617. START_TEST(touchpad_edge_scroll_horiz)
  618. {
  619. struct litest_device *dev = litest_current_device();
  620. struct libinput *li = dev->libinput;
  621. litest_touch_down(dev, 0, 99, 20);
  622. litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10);
  623. litest_touch_up(dev, 0);
  624. if (!touchpad_has_horiz_edge_scroll_size(dev))
  625. return LITEST_NOT_APPLICABLE;
  626. litest_drain_events(li);
  627. litest_enable_edge_scroll(dev);
  628. litest_touch_down(dev, 0, 20, 99);
  629. litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10);
  630. litest_touch_up(dev, 0);
  631. litest_dispatch(li);
  632. litest_assert_scroll(li,
  633. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  634. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  635. 4);
  636. litest_assert_empty_queue(li);
  637. litest_touch_down(dev, 0, 70, 99);
  638. litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10);
  639. litest_touch_up(dev, 0);
  640. litest_dispatch(li);
  641. litest_assert_scroll(li,
  642. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  643. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  644. -4);
  645. litest_assert_empty_queue(li);
  646. }
  647. END_TEST
  648. START_TEST(touchpad_edge_scroll_horiz_clickpad)
  649. {
  650. struct litest_device *dev = litest_current_device();
  651. struct libinput *li = dev->libinput;
  652. litest_drain_events(li);
  653. litest_enable_edge_scroll(dev);
  654. litest_touch_down(dev, 0, 20, 99);
  655. litest_touch_move_to(dev, 0, 20, 99, 70, 99, 15);
  656. litest_touch_up(dev, 0);
  657. litest_dispatch(li);
  658. litest_assert_scroll(li,
  659. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  660. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  661. 4);
  662. litest_assert_empty_queue(li);
  663. litest_touch_down(dev, 0, 70, 99);
  664. litest_touch_move_to(dev, 0, 70, 99, 20, 99, 15);
  665. litest_touch_up(dev, 0);
  666. litest_dispatch(li);
  667. litest_assert_scroll(li,
  668. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  669. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  670. -4);
  671. litest_assert_empty_queue(li);
  672. }
  673. END_TEST
  674. START_TEST(touchpad_edge_scroll_no_horiz)
  675. {
  676. struct litest_device *dev = litest_current_device();
  677. struct libinput *li = dev->libinput;
  678. if (touchpad_has_horiz_edge_scroll_size(dev))
  679. return LITEST_NOT_APPLICABLE;
  680. litest_drain_events(li);
  681. litest_enable_edge_scroll(dev);
  682. litest_touch_down(dev, 0, 20, 99);
  683. litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10);
  684. litest_touch_up(dev, 0);
  685. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  686. litest_touch_down(dev, 0, 70, 99);
  687. litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10);
  688. litest_touch_up(dev, 0);
  689. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  690. }
  691. END_TEST
  692. START_TEST(touchpad_scroll_defaults)
  693. {
  694. struct litest_device *dev = litest_current_device();
  695. struct libinput_device *device = dev->libinput_device;
  696. struct libevdev *evdev = dev->evdev;
  697. enum libinput_config_scroll_method method, expected;
  698. enum libinput_config_status status;
  699. bool should_have_2fg = false;
  700. if (libevdev_get_num_slots(evdev) > 1 ||
  701. (libevdev_get_id_vendor(dev->evdev) == VENDOR_ID_APPLE &&
  702. libevdev_get_id_product(dev->evdev) == PRODUCT_ID_APPLE_APPLETOUCH))
  703. should_have_2fg = true;
  704. method = libinput_device_config_scroll_get_methods(device);
  705. litest_assert(method & LIBINPUT_CONFIG_SCROLL_EDGE);
  706. if (should_have_2fg)
  707. litest_assert(method & LIBINPUT_CONFIG_SCROLL_2FG);
  708. else
  709. litest_assert((method & LIBINPUT_CONFIG_SCROLL_2FG) == 0);
  710. if (should_have_2fg)
  711. expected = LIBINPUT_CONFIG_SCROLL_2FG;
  712. else
  713. expected = LIBINPUT_CONFIG_SCROLL_EDGE;
  714. method = libinput_device_config_scroll_get_method(device);
  715. litest_assert_int_eq(method, expected);
  716. method = libinput_device_config_scroll_get_default_method(device);
  717. litest_assert_int_eq(method, expected);
  718. status = libinput_device_config_scroll_set_method(device,
  719. LIBINPUT_CONFIG_SCROLL_EDGE);
  720. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  721. status = libinput_device_config_scroll_set_method(device,
  722. LIBINPUT_CONFIG_SCROLL_2FG);
  723. if (should_have_2fg)
  724. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  725. else
  726. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
  727. }
  728. END_TEST
  729. START_TEST(touchpad_edge_scroll_timeout)
  730. {
  731. struct litest_device *dev = litest_current_device();
  732. struct libinput *li = dev->libinput;
  733. struct libinput_event *event;
  734. double width = 0, height = 0;
  735. int nevents = 0;
  736. double mm; /* one mm in percent of the device */
  737. litest_assert_int_eq(
  738. libinput_device_get_size(dev->libinput_device, &width, &height),
  739. 0);
  740. mm = 100.0 / height;
  741. /* timeout-based scrolling is disabled when software buttons are
  742. * active, so switch to clickfinger. Not all test devices support
  743. * that, hence the extra check. */
  744. if (libinput_device_config_click_get_methods(dev->libinput_device) &
  745. LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER)
  746. litest_enable_clickfinger(dev);
  747. litest_drain_events(li);
  748. litest_enable_edge_scroll(dev);
  749. /* move 0.5mm, enough to load up the motion history, but less than
  750. * the scroll threshold of 2mm */
  751. litest_touch_down(dev, 0, 99, 20);
  752. litest_dispatch(li);
  753. litest_timeout_hysteresis(li);
  754. litest_dispatch(li);
  755. litest_touch_move_to(dev, 0, 99, 20, 99, 20 + mm / 2, 8);
  756. litest_dispatch(li);
  757. litest_assert_empty_queue(li);
  758. litest_timeout_edgescroll(li);
  759. litest_dispatch(li);
  760. litest_assert_empty_queue(li);
  761. /* now move slowly up to the 2mm scroll threshold. we expect events */
  762. litest_touch_move_to(dev, 0, 99, 20 + mm / 2, 99, 20 + mm * 2, 20);
  763. litest_touch_up(dev, 0);
  764. litest_dispatch(li);
  765. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  766. while ((event = libinput_get_event(li))) {
  767. struct libinput_event_pointer *ptrev;
  768. double value;
  769. ptrev = litest_is_axis_event(event,
  770. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  771. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  772. 0);
  773. value = litest_event_pointer_get_value(
  774. ptrev,
  775. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
  776. litest_assert_double_lt(value, 5.0);
  777. libinput_event_destroy(event);
  778. nevents++;
  779. }
  780. /* we sent 20 events but allow for some to be swallowed by rounding
  781. * errors, the hysteresis, etc. */
  782. litest_assert_int_ge(nevents, 10);
  783. litest_assert_empty_queue(li);
  784. libinput_event_destroy(event);
  785. }
  786. END_TEST
  787. START_TEST(touchpad_edge_scroll_no_motion)
  788. {
  789. struct litest_device *dev = litest_current_device();
  790. struct libinput *li = dev->libinput;
  791. litest_drain_events(li);
  792. litest_enable_edge_scroll(dev);
  793. litest_touch_down(dev, 0, 99, 10);
  794. litest_touch_move_to(dev, 0, 99, 10, 99, 70, 12);
  795. /* moving outside -> no motion event */
  796. litest_touch_move_to(dev, 0, 99, 70, 20, 70, 12);
  797. /* moving down outside edge once scrolling had started -> scroll */
  798. litest_touch_move_to(dev, 0, 20, 70, 40, 99, 12);
  799. litest_touch_up(dev, 0);
  800. litest_dispatch(li);
  801. litest_assert_scroll(li,
  802. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  803. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  804. 4);
  805. litest_assert_empty_queue(li);
  806. }
  807. END_TEST
  808. START_TEST(touchpad_edge_scroll_no_edge_after_motion)
  809. {
  810. struct litest_device *dev = litest_current_device();
  811. struct libinput *li = dev->libinput;
  812. litest_drain_events(li);
  813. litest_enable_edge_scroll(dev);
  814. /* moving into the edge zone must not trigger scroll events */
  815. litest_touch_down(dev, 0, 20, 20);
  816. litest_touch_move_to(dev, 0, 20, 20, 99, 20, 22);
  817. litest_touch_move_to(dev, 0, 99, 20, 99, 80, 22);
  818. litest_touch_up(dev, 0);
  819. litest_dispatch(li);
  820. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  821. litest_assert_empty_queue(li);
  822. }
  823. END_TEST
  824. START_TEST(touchpad_edge_scroll_source)
  825. {
  826. struct litest_device *dev = litest_current_device();
  827. struct libinput *li = dev->libinput;
  828. struct libinput_event *event;
  829. litest_drain_events(li);
  830. litest_enable_edge_scroll(dev);
  831. litest_touch_down(dev, 0, 99, 20);
  832. litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10);
  833. litest_touch_up(dev, 0);
  834. litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS);
  835. while ((event = libinput_get_event(li))) {
  836. struct libinput_event_pointer *ptrev;
  837. ptrev = litest_is_axis_event(event,
  838. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  839. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  840. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  841. litest_assert_enum_eq(litest_event_pointer_get_axis_source(ptrev),
  842. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  843. libinput_event_destroy(event);
  844. }
  845. }
  846. END_TEST
  847. START_TEST(touchpad_edge_scroll_no_2fg)
  848. {
  849. struct litest_device *dev = litest_current_device();
  850. struct libinput *li = dev->libinput;
  851. litest_drain_events(li);
  852. litest_enable_edge_scroll(dev);
  853. litest_touch_down(dev, 0, 49, 50);
  854. litest_touch_down(dev, 1, 51, 50);
  855. litest_touch_move_two_touches(dev, 49, 50, 51, 50, 20, 30, 10);
  856. litest_dispatch(li);
  857. litest_touch_up(dev, 0);
  858. litest_touch_up(dev, 1);
  859. litest_dispatch(li);
  860. litest_assert_empty_queue(li);
  861. }
  862. END_TEST
  863. START_TEST(touchpad_edge_scroll_into_buttonareas)
  864. {
  865. struct litest_device *dev = litest_current_device();
  866. struct libinput *li = dev->libinput;
  867. litest_enable_buttonareas(dev);
  868. litest_enable_edge_scroll(dev);
  869. litest_drain_events(li);
  870. litest_touch_down(dev, 0, 99, 40);
  871. litest_touch_move_to(dev, 0, 99, 40, 99, 95, 10);
  872. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  873. /* in the button zone now, make sure we still get events */
  874. litest_touch_move_to(dev, 0, 99, 95, 99, 100, 10);
  875. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  876. /* and out of the zone again */
  877. litest_touch_move_to(dev, 0, 99, 100, 99, 70, 10);
  878. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  879. /* still out of the zone */
  880. litest_touch_move_to(dev, 0, 99, 70, 99, 50, 10);
  881. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  882. }
  883. END_TEST
  884. START_TEST(touchpad_edge_scroll_within_buttonareas)
  885. {
  886. struct litest_device *dev = litest_current_device();
  887. struct libinput *li = dev->libinput;
  888. if (!touchpad_has_horiz_edge_scroll_size(dev))
  889. return LITEST_NOT_APPLICABLE;
  890. litest_enable_buttonareas(dev);
  891. litest_enable_edge_scroll(dev);
  892. litest_drain_events(li);
  893. litest_touch_down(dev, 0, 20, 99);
  894. /* within left button */
  895. litest_touch_move_to(dev, 0, 20, 99, 40, 99, 10);
  896. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  897. /* over to right button */
  898. litest_touch_move_to(dev, 0, 40, 99, 60, 99, 10);
  899. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  900. /* within right button */
  901. litest_touch_move_to(dev, 0, 60, 99, 80, 99, 10);
  902. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  903. }
  904. END_TEST
  905. START_TEST(touchpad_edge_scroll_buttonareas_click_stops_scroll)
  906. {
  907. struct litest_device *dev = litest_current_device();
  908. struct libinput *li = dev->libinput;
  909. struct libinput_event *event;
  910. if (!touchpad_has_horiz_edge_scroll_size(dev))
  911. return LITEST_NOT_APPLICABLE;
  912. litest_enable_buttonareas(dev);
  913. litest_enable_edge_scroll(dev);
  914. litest_drain_events(li);
  915. litest_touch_down(dev, 0, 20, 95);
  916. litest_touch_move_to(dev, 0, 20, 95, 70, 95, 15);
  917. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  918. litest_button_click(dev, BTN_LEFT, true);
  919. litest_dispatch(li);
  920. litest_assert_axis_end_sequence(li,
  921. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  922. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  923. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  924. event = libinput_get_event(li);
  925. litest_is_button_event(event, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  926. libinput_event_destroy(event);
  927. /* move within button areas but we cancelled the scroll so now we
  928. * get pointer motion events when moving.
  929. *
  930. * This is not ideal behavior, but the use-case of horizontal
  931. * edge scrolling, click, then scrolling without lifting the finger
  932. * is so small we'll let it pass.
  933. */
  934. litest_touch_move_to(dev, 0, 70, 95, 90, 95, 15);
  935. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  936. litest_button_click(dev, BTN_LEFT, false);
  937. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  938. litest_touch_up(dev, 0);
  939. }
  940. END_TEST
  941. START_TEST(touchpad_edge_scroll_clickfinger_click_stops_scroll)
  942. {
  943. struct litest_device *dev = litest_current_device();
  944. struct libinput *li = dev->libinput;
  945. struct libinput_event *event;
  946. if (!touchpad_has_horiz_edge_scroll_size(dev))
  947. return LITEST_NOT_APPLICABLE;
  948. litest_enable_clickfinger(dev);
  949. litest_enable_edge_scroll(dev);
  950. litest_drain_events(li);
  951. litest_touch_down(dev, 0, 20, 95);
  952. litest_touch_move_to(dev, 0, 20, 95, 70, 95, 15);
  953. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  954. litest_button_click(dev, BTN_LEFT, true);
  955. litest_dispatch(li);
  956. litest_assert_axis_end_sequence(li,
  957. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  958. LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
  959. LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
  960. event = libinput_get_event(li);
  961. litest_is_button_event(event, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  962. libinput_event_destroy(event);
  963. /* clickfinger releases pointer -> expect movement */
  964. litest_touch_move_to(dev, 0, 70, 95, 90, 95, 15);
  965. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  966. litest_assert_empty_queue(li);
  967. litest_button_click(dev, BTN_LEFT, false);
  968. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  969. litest_touch_up(dev, 0);
  970. }
  971. END_TEST
  972. START_TEST(touchpad_edge_scroll_into_area)
  973. {
  974. struct litest_device *dev = litest_current_device();
  975. struct libinput *li = dev->libinput;
  976. litest_enable_edge_scroll(dev);
  977. litest_drain_events(li);
  978. /* move into area, move vertically, move back to edge */
  979. litest_touch_down(dev, 0, 99, 20);
  980. litest_touch_move_to(dev, 0, 99, 20, 99, 50, 15);
  981. litest_touch_move_to(dev, 0, 99, 50, 20, 50, 15);
  982. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  983. litest_touch_move_to(dev, 0, 20, 50, 20, 20, 15);
  984. litest_touch_move_to(dev, 0, 20, 20, 99, 20, 15);
  985. litest_assert_empty_queue(li);
  986. litest_touch_move_to(dev, 0, 99, 20, 99, 50, 15);
  987. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  988. }
  989. END_TEST
  990. static bool
  991. touchpad_has_top_palm_detect_size(struct litest_device *dev)
  992. {
  993. double width, height;
  994. int rc;
  995. if (!litest_has_palm_detect_size(dev))
  996. return false;
  997. rc = libinput_device_get_size(dev->libinput_device, &width, &height);
  998. return rc == 0 && height > 55;
  999. }
  1000. START_TEST(touchpad_palm_detect_at_edge)
  1001. {
  1002. struct litest_device *dev = litest_current_device();
  1003. struct libinput *li = dev->libinput;
  1004. if (!litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  1005. return LITEST_NOT_APPLICABLE;
  1006. litest_enable_2fg_scroll(dev);
  1007. litest_disable_tap(dev->libinput_device);
  1008. litest_disable_hold_gestures(dev->libinput_device);
  1009. litest_drain_events(li);
  1010. litest_touch_down(dev, 0, 99, 50);
  1011. litest_touch_move_to(dev, 0, 99, 50, 99, 70, 5);
  1012. litest_touch_up(dev, 0);
  1013. litest_assert_empty_queue(li);
  1014. litest_touch_down(dev, 0, 5, 50);
  1015. litest_touch_move_to(dev, 0, 5, 50, 5, 70, 5);
  1016. litest_touch_up(dev, 0);
  1017. litest_assert_empty_queue(li);
  1018. }
  1019. END_TEST
  1020. START_TEST(touchpad_palm_detect_at_top)
  1021. {
  1022. struct litest_device *dev = litest_current_device();
  1023. struct libinput *li = dev->libinput;
  1024. if (!touchpad_has_top_palm_detect_size(dev))
  1025. return LITEST_NOT_APPLICABLE;
  1026. litest_disable_tap(dev->libinput_device);
  1027. litest_disable_hold_gestures(dev->libinput_device);
  1028. litest_drain_events(li);
  1029. litest_touch_down(dev, 0, 20, 1);
  1030. litest_touch_move_to(dev, 0, 20, 1, 70, 1, 15);
  1031. litest_touch_up(dev, 0);
  1032. litest_assert_empty_queue(li);
  1033. }
  1034. END_TEST
  1035. START_TEST(touchpad_no_palm_detect_at_edge_for_edge_scrolling)
  1036. {
  1037. struct litest_device *dev = litest_current_device();
  1038. struct libinput *li = dev->libinput;
  1039. if (!litest_has_palm_detect_size(dev))
  1040. return LITEST_NOT_APPLICABLE;
  1041. litest_enable_edge_scroll(dev);
  1042. litest_drain_events(li);
  1043. litest_touch_down(dev, 0, 99, 50);
  1044. litest_touch_move_to(dev, 0, 99, 50, 99, 70, 5);
  1045. litest_touch_up(dev, 0);
  1046. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  1047. }
  1048. END_TEST
  1049. START_TEST(touchpad_palm_detect_at_bottom_corners)
  1050. {
  1051. struct litest_device *dev = litest_current_device();
  1052. struct libinput *li = dev->libinput;
  1053. if (!litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  1054. return LITEST_NOT_APPLICABLE;
  1055. litest_enable_2fg_scroll(dev);
  1056. litest_disable_tap(dev->libinput_device);
  1057. litest_disable_hold_gestures(dev->libinput_device);
  1058. /* Run for non-clickpads only: make sure the bottom corners trigger
  1059. palm detection too */
  1060. litest_drain_events(li);
  1061. litest_touch_down(dev, 0, 99, 95);
  1062. litest_touch_move_to(dev, 0, 99, 95, 99, 99, 10);
  1063. litest_touch_up(dev, 0);
  1064. litest_assert_empty_queue(li);
  1065. litest_touch_down(dev, 0, 5, 95);
  1066. litest_touch_move_to(dev, 0, 5, 95, 5, 99, 5);
  1067. litest_touch_up(dev, 0);
  1068. }
  1069. END_TEST
  1070. START_TEST(touchpad_palm_detect_at_top_corners)
  1071. {
  1072. struct litest_device *dev = litest_current_device();
  1073. struct libinput *li = dev->libinput;
  1074. if (!litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  1075. return LITEST_NOT_APPLICABLE;
  1076. litest_enable_2fg_scroll(dev);
  1077. litest_disable_tap(dev->libinput_device);
  1078. litest_disable_hold_gestures(dev->libinput_device);
  1079. /* Run for non-clickpads only: make sure the bottom corners trigger
  1080. palm detection too */
  1081. litest_drain_events(li);
  1082. litest_touch_down(dev, 0, 99, 5);
  1083. litest_touch_move_to(dev, 0, 99, 5, 99, 9, 10);
  1084. litest_touch_up(dev, 0);
  1085. litest_assert_empty_queue(li);
  1086. litest_touch_down(dev, 0, 5, 5);
  1087. litest_touch_move_to(dev, 0, 5, 5, 5, 9, 5);
  1088. litest_touch_up(dev, 0);
  1089. litest_assert_empty_queue(li);
  1090. }
  1091. END_TEST
  1092. START_TEST(touchpad_palm_detect_palm_stays_palm)
  1093. {
  1094. struct litest_device *dev = litest_current_device();
  1095. struct libinput *li = dev->libinput;
  1096. if (!litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  1097. return LITEST_NOT_APPLICABLE;
  1098. litest_enable_2fg_scroll(dev);
  1099. litest_disable_tap(dev->libinput_device);
  1100. litest_disable_hold_gestures(dev->libinput_device);
  1101. litest_drain_events(li);
  1102. litest_touch_down(dev, 0, 99, 20);
  1103. litest_touch_move_to(dev, 0, 99, 20, 75, 99, 20);
  1104. litest_touch_up(dev, 0);
  1105. litest_assert_empty_queue(li);
  1106. }
  1107. END_TEST
  1108. START_TEST(touchpad_palm_detect_top_palm_stays_palm)
  1109. {
  1110. struct litest_device *dev = litest_current_device();
  1111. struct libinput *li = dev->libinput;
  1112. if (!touchpad_has_top_palm_detect_size(dev))
  1113. return LITEST_NOT_APPLICABLE;
  1114. litest_disable_tap(dev->libinput_device);
  1115. litest_disable_hold_gestures(dev->libinput_device);
  1116. litest_drain_events(li);
  1117. litest_touch_down(dev, 0, 20, 1);
  1118. litest_touch_move_to(dev, 0, 20, 1, 50, 30, 20);
  1119. litest_touch_up(dev, 0);
  1120. litest_assert_empty_queue(li);
  1121. }
  1122. END_TEST
  1123. START_TEST(touchpad_palm_detect_palm_becomes_pointer)
  1124. {
  1125. struct litest_device *dev = litest_current_device();
  1126. struct libinput *li = dev->libinput;
  1127. if (!litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  1128. return LITEST_NOT_APPLICABLE;
  1129. litest_enable_2fg_scroll(dev);
  1130. litest_disable_tap(dev->libinput_device);
  1131. litest_disable_hold_gestures(dev->libinput_device);
  1132. litest_drain_events(li);
  1133. litest_touch_down(dev, 0, 99, 50);
  1134. litest_touch_move_to(dev, 0, 99, 50, 0, 70, 25);
  1135. litest_touch_up(dev, 0);
  1136. litest_dispatch(li);
  1137. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  1138. litest_assert_empty_queue(li);
  1139. }
  1140. END_TEST
  1141. START_TEST(touchpad_palm_detect_top_palm_becomes_pointer)
  1142. {
  1143. struct litest_device *dev = litest_current_device();
  1144. struct libinput *li = dev->libinput;
  1145. if (!touchpad_has_top_palm_detect_size(dev))
  1146. return LITEST_NOT_APPLICABLE;
  1147. litest_disable_tap(dev->libinput_device);
  1148. litest_disable_hold_gestures(dev->libinput_device);
  1149. litest_drain_events(li);
  1150. litest_touch_down(dev, 0, 50, 1);
  1151. litest_touch_move_to(dev, 0, 50, 1, 50, 60, 20);
  1152. litest_touch_up(dev, 0);
  1153. litest_dispatch(li);
  1154. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  1155. litest_assert_empty_queue(li);
  1156. }
  1157. END_TEST
  1158. START_TEST(touchpad_palm_detect_no_palm_moving_into_edges)
  1159. {
  1160. struct litest_device *dev = litest_current_device();
  1161. struct libinput *li = dev->libinput;
  1162. if (!litest_has_palm_detect_size(dev))
  1163. return LITEST_NOT_APPLICABLE;
  1164. litest_disable_tap(dev->libinput_device);
  1165. litest_disable_hold_gestures(dev->libinput_device);
  1166. /* moving non-palm into the edge does not label it as palm */
  1167. litest_drain_events(li);
  1168. litest_touch_down(dev, 0, 50, 50);
  1169. litest_touch_move_to(dev, 0, 50, 50, 99, 50, 15);
  1170. litest_drain_events(li);
  1171. litest_touch_move_to(dev, 0, 99, 50, 99, 90, 15);
  1172. litest_dispatch(li);
  1173. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  1174. litest_touch_up(dev, 0);
  1175. litest_dispatch(li);
  1176. litest_assert_empty_queue(li);
  1177. }
  1178. END_TEST
  1179. START_TEST(touchpad_palm_detect_no_palm_moving_into_top)
  1180. {
  1181. struct litest_device *dev = litest_current_device();
  1182. struct libinput *li = dev->libinput;
  1183. if (!touchpad_has_top_palm_detect_size(dev))
  1184. return LITEST_NOT_APPLICABLE;
  1185. litest_disable_tap(dev->libinput_device);
  1186. litest_disable_hold_gestures(dev->libinput_device);
  1187. /* moving non-palm into the edge does not label it as palm */
  1188. litest_drain_events(li);
  1189. litest_touch_down(dev, 0, 50, 50);
  1190. litest_touch_move_to(dev, 0, 50, 50, 0, 2, 15);
  1191. litest_drain_events(li);
  1192. litest_touch_move_to(dev, 0, 0, 2, 50, 50, 15);
  1193. litest_dispatch(li);
  1194. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  1195. litest_touch_up(dev, 0);
  1196. litest_dispatch(li);
  1197. litest_assert_empty_queue(li);
  1198. }
  1199. END_TEST
  1200. START_TEST(touchpad_palm_detect_no_tap_top_edge)
  1201. {
  1202. struct litest_device *dev = litest_current_device();
  1203. struct libinput *li = dev->libinput;
  1204. if (!touchpad_has_top_palm_detect_size(dev))
  1205. return LITEST_NOT_APPLICABLE;
  1206. litest_enable_tap(dev->libinput_device);
  1207. litest_disable_hold_gestures(dev->libinput_device);
  1208. litest_drain_events(li);
  1209. litest_touch_down(dev, 0, 50, 1);
  1210. litest_touch_up(dev, 0);
  1211. litest_timeout_tap(li);
  1212. litest_assert_empty_queue(li);
  1213. }
  1214. END_TEST
  1215. START_TEST(touchpad_palm_detect_tap_hardbuttons)
  1216. {
  1217. struct litest_device *dev = litest_current_device();
  1218. struct libinput *li = dev->libinput;
  1219. if (!litest_has_palm_detect_size(dev))
  1220. return LITEST_NOT_APPLICABLE;
  1221. litest_enable_tap(dev->libinput_device);
  1222. litest_disable_hold_gestures(dev->libinput_device);
  1223. litest_drain_events(li);
  1224. litest_touch_down(dev, 0, 95, 5);
  1225. litest_touch_up(dev, 0);
  1226. litest_timeout_tap(li);
  1227. litest_assert_empty_queue(li);
  1228. litest_touch_down(dev, 0, 5, 5);
  1229. litest_touch_up(dev, 0);
  1230. litest_timeout_tap(li);
  1231. litest_assert_empty_queue(li);
  1232. litest_touch_down(dev, 0, 5, 99);
  1233. litest_touch_up(dev, 0);
  1234. litest_timeout_tap(li);
  1235. litest_assert_empty_queue(li);
  1236. litest_touch_down(dev, 0, 95, 99);
  1237. litest_touch_up(dev, 0);
  1238. litest_timeout_tap(li);
  1239. litest_assert_empty_queue(li);
  1240. }
  1241. END_TEST
  1242. START_TEST(touchpad_palm_detect_tap_softbuttons)
  1243. {
  1244. struct litest_device *dev = litest_current_device();
  1245. struct libinput *li = dev->libinput;
  1246. if (!litest_has_palm_detect_size(dev))
  1247. return LITEST_NOT_APPLICABLE;
  1248. litest_enable_tap(dev->libinput_device);
  1249. litest_enable_buttonareas(dev);
  1250. litest_disable_hold_gestures(dev->libinput_device);
  1251. litest_drain_events(li);
  1252. /* Two touches in the software button area, but inside
  1253. * the palm detection edge zone -> expect palm detection */
  1254. litest_touch_down(dev, 0, 99, 99);
  1255. litest_touch_up(dev, 0);
  1256. litest_timeout_tap(li);
  1257. litest_assert_empty_queue(li);
  1258. litest_touch_down(dev, 0, 1, 99);
  1259. litest_touch_up(dev, 0);
  1260. litest_timeout_tap(li);
  1261. litest_assert_empty_queue(li);
  1262. /* Two touches in the software button area, but
  1263. * not in the palm detection edge zone -> expect taps */
  1264. litest_touch_down(dev, 0, 10, 99);
  1265. litest_touch_up(dev, 0);
  1266. litest_timeout_tap(li);
  1267. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1268. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1269. litest_assert_empty_queue(li);
  1270. litest_touch_down(dev, 0, 90, 99);
  1271. litest_touch_up(dev, 0);
  1272. litest_timeout_tap(li);
  1273. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1274. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1275. litest_assert_empty_queue(li);
  1276. }
  1277. END_TEST
  1278. START_TEST(touchpad_palm_detect_tap_clickfinger)
  1279. {
  1280. struct litest_device *dev = litest_current_device();
  1281. struct libinput *li = dev->libinput;
  1282. if (!litest_has_palm_detect_size(dev))
  1283. return LITEST_NOT_APPLICABLE;
  1284. litest_enable_tap(dev->libinput_device);
  1285. litest_enable_clickfinger(dev);
  1286. litest_disable_hold_gestures(dev->libinput_device);
  1287. litest_drain_events(li);
  1288. /* Taps in each of the 4 corners of the touchpad, all
  1289. * inside the palm detection edge zone*/
  1290. litest_touch_down(dev, 0, 95, 5);
  1291. litest_touch_up(dev, 0);
  1292. litest_timeout_tap(li);
  1293. litest_assert_empty_queue(li);
  1294. litest_touch_down(dev, 0, 5, 5);
  1295. litest_touch_up(dev, 0);
  1296. litest_timeout_tap(li);
  1297. litest_assert_empty_queue(li);
  1298. litest_touch_down(dev, 0, 5, 99);
  1299. litest_touch_up(dev, 0);
  1300. litest_timeout_tap(li);
  1301. litest_assert_empty_queue(li);
  1302. litest_touch_down(dev, 0, 95, 99);
  1303. litest_touch_up(dev, 0);
  1304. litest_timeout_tap(li);
  1305. litest_assert_empty_queue(li);
  1306. }
  1307. END_TEST
  1308. START_TEST(touchpad_no_palm_detect_2fg_scroll)
  1309. {
  1310. struct litest_device *dev = litest_current_device();
  1311. struct libinput *li = dev->libinput;
  1312. if (!litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  1313. return LITEST_NOT_APPLICABLE;
  1314. litest_enable_2fg_scroll(dev);
  1315. litest_drain_events(li);
  1316. /* first finger is palm, second finger isn't so we trigger 2fg
  1317. * scrolling */
  1318. litest_touch_down(dev, 0, 99, 50);
  1319. litest_touch_move_to(dev, 0, 99, 50, 99, 40, 45);
  1320. litest_touch_move_to(dev, 0, 99, 40, 99, 50, 45);
  1321. litest_assert_empty_queue(li);
  1322. litest_touch_down(dev, 1, 50, 50);
  1323. litest_assert_empty_queue(li);
  1324. litest_touch_move_two_touches(dev, 99, 50, 50, 50, 0, -20, 10);
  1325. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  1326. }
  1327. END_TEST
  1328. START_TEST(touchpad_palm_detect_both_edges)
  1329. {
  1330. struct litest_device *dev = litest_current_device();
  1331. struct libinput *li = dev->libinput;
  1332. if (!litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  1333. return LITEST_NOT_APPLICABLE;
  1334. litest_enable_2fg_scroll(dev);
  1335. litest_drain_events(li);
  1336. /* two fingers moving up/down in the left/right palm zone must not
  1337. * generate events */
  1338. litest_touch_down(dev, 0, 99, 50);
  1339. litest_touch_move_to(dev, 0, 99, 50, 99, 40, 10);
  1340. litest_touch_move_to(dev, 0, 99, 40, 99, 50, 10);
  1341. litest_assert_empty_queue(li);
  1342. /* This set generates events */
  1343. litest_touch_down(dev, 1, 1, 50);
  1344. litest_touch_move_to(dev, 1, 1, 50, 1, 40, 10);
  1345. litest_touch_move_to(dev, 1, 1, 40, 1, 50, 10);
  1346. litest_assert_empty_queue(li);
  1347. litest_touch_move_two_touches(dev, 99, 50, 1, 50, 0, -20, 10);
  1348. litest_assert_empty_queue(li);
  1349. }
  1350. END_TEST
  1351. static inline bool
  1352. touchpad_has_tool_palm(struct litest_device *dev)
  1353. {
  1354. return libevdev_has_event_code(dev->evdev, EV_ABS, ABS_MT_TOOL_TYPE);
  1355. }
  1356. START_TEST(touchpad_palm_detect_tool_palm)
  1357. {
  1358. struct litest_device *dev = litest_current_device();
  1359. struct libinput *li = dev->libinput;
  1360. if (!touchpad_has_tool_palm(dev))
  1361. return LITEST_NOT_APPLICABLE;
  1362. litest_touch_down(dev, 0, 50, 50);
  1363. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  1364. litest_drain_events(li);
  1365. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM);
  1366. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1367. litest_touch_move_to(dev, 0, 70, 70, 50, 40, 10);
  1368. litest_touch_up(dev, 0);
  1369. litest_assert_empty_queue(li);
  1370. }
  1371. END_TEST
  1372. START_TEST(touchpad_palm_detect_tool_palm_on_off)
  1373. {
  1374. struct litest_device *dev = litest_current_device();
  1375. struct libinput *li = dev->libinput;
  1376. if (!touchpad_has_tool_palm(dev))
  1377. return LITEST_NOT_APPLICABLE;
  1378. litest_touch_down(dev, 0, 50, 50);
  1379. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  1380. litest_drain_events(li);
  1381. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM);
  1382. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1383. litest_touch_move_to(dev, 0, 70, 70, 50, 40, 10);
  1384. litest_assert_empty_queue(li);
  1385. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER);
  1386. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1387. litest_touch_move_to(dev, 0, 50, 40, 70, 70, 10);
  1388. litest_touch_up(dev, 0);
  1389. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  1390. }
  1391. END_TEST
  1392. START_TEST(touchpad_palm_detect_tool_palm_stale_after_sendevents)
  1393. {
  1394. struct litest_device *dev = litest_current_device();
  1395. struct libinput *li = dev->libinput;
  1396. if (!touchpad_has_tool_palm(dev))
  1397. return LITEST_NOT_APPLICABLE;
  1398. /* Touch flagged as palm by the firmware */
  1399. litest_touch_down(dev, 0, 50, 50);
  1400. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM);
  1401. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1402. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  1403. litest_drain_events(li);
  1404. /* While the device is disabled (fd closed), the kernel slot
  1405. * reverts to finger - we never see that event */
  1406. litest_sendevents_off(dev);
  1407. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER);
  1408. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  1409. litest_touch_up(dev, 0);
  1410. litest_sendevents_on(dev);
  1411. litest_drain_events(li);
  1412. /* A new finger in the same slot must not be treated as palm */
  1413. litest_touch_down(dev, 0, 50, 50);
  1414. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  1415. litest_touch_up(dev, 0);
  1416. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  1417. }
  1418. END_TEST
  1419. START_TEST(touchpad_palm_detect_tool_palm_tap_after)
  1420. {
  1421. struct litest_device *dev = litest_current_device();
  1422. struct libinput *li = dev->libinput;
  1423. if (!touchpad_has_tool_palm(dev))
  1424. return LITEST_NOT_APPLICABLE;
  1425. litest_enable_tap(dev->libinput_device);
  1426. litest_disable_hold_gestures(dev->libinput_device);
  1427. litest_drain_events(li);
  1428. litest_push_event_frame(dev);
  1429. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM);
  1430. litest_touch_down(dev, 0, 50, 50);
  1431. litest_pop_event_frame(dev);
  1432. litest_dispatch(li);
  1433. litest_touch_move_to(dev, 0, 50, 50, 50, 80, 10);
  1434. litest_dispatch(li);
  1435. litest_assert_empty_queue(li);
  1436. litest_push_event_frame(dev);
  1437. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER);
  1438. litest_touch_up(dev, 0);
  1439. litest_pop_event_frame(dev);
  1440. litest_timeout_tap(li);
  1441. litest_assert_empty_queue(li);
  1442. litest_touch_down(dev, 0, 50, 50);
  1443. litest_dispatch(li);
  1444. litest_touch_up(dev, 0);
  1445. litest_timeout_tap(li);
  1446. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1447. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1448. litest_assert_empty_queue(li);
  1449. }
  1450. END_TEST
  1451. START_TEST(touchpad_palm_detect_tool_palm_tap)
  1452. {
  1453. struct litest_device *dev = litest_current_device();
  1454. struct libinput *li = dev->libinput;
  1455. if (!touchpad_has_tool_palm(dev))
  1456. return LITEST_NOT_APPLICABLE;
  1457. litest_enable_tap(dev->libinput_device);
  1458. litest_disable_hold_gestures(dev->libinput_device);
  1459. litest_drain_events(li);
  1460. litest_push_event_frame(dev);
  1461. litest_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM);
  1462. litest_touch_down(dev, 0, 50, 50);
  1463. litest_pop_event_frame(dev);
  1464. litest_dispatch(li);
  1465. litest_assert_empty_queue(li);
  1466. litest_touch_up(dev, 0);
  1467. litest_timeout_tap(li);
  1468. litest_assert_empty_queue(li);
  1469. }
  1470. END_TEST
  1471. static inline bool
  1472. touchpad_has_palm_pressure(struct litest_device *dev)
  1473. {
  1474. struct libevdev *evdev = dev->evdev;
  1475. if (dev->which == LITEST_SYNAPTICS_PRESSUREPAD)
  1476. return false;
  1477. if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_PRESSURE))
  1478. return libevdev_get_abs_resolution(evdev, ABS_MT_PRESSURE) == 0;
  1479. return false;
  1480. }
  1481. START_TEST(touchpad_palm_detect_pressure)
  1482. {
  1483. struct litest_device *dev = litest_current_device();
  1484. struct libinput *li = dev->libinput;
  1485. struct axis_replacement axes[] = {
  1486. { ABS_MT_PRESSURE, 75 },
  1487. { -1, 0 },
  1488. };
  1489. if (!touchpad_has_palm_pressure(dev))
  1490. return LITEST_NOT_APPLICABLE;
  1491. litest_disable_tap(dev->libinput_device);
  1492. litest_disable_hold_gestures(dev->libinput_device);
  1493. litest_drain_events(li);
  1494. litest_touch_down_extended(dev, 0, 50, 99, axes);
  1495. litest_touch_move_to(dev, 0, 50, 50, 80, 99, 10);
  1496. litest_touch_up(dev, 0);
  1497. litest_assert_empty_queue(li);
  1498. }
  1499. END_TEST
  1500. START_TEST(touchpad_palm_detect_pressure_late_tap)
  1501. {
  1502. struct litest_device *dev = litest_current_device();
  1503. struct libinput *li = dev->libinput;
  1504. struct axis_replacement axes[] = {
  1505. { ABS_MT_PRESSURE, 75 },
  1506. { -1, 0 },
  1507. };
  1508. if (!touchpad_has_palm_pressure(dev))
  1509. return LITEST_NOT_APPLICABLE;
  1510. litest_enable_tap(dev->libinput_device);
  1511. litest_enable_clickfinger(dev);
  1512. litest_disable_hold_gestures(dev->libinput_device);
  1513. litest_drain_events(li);
  1514. /* event after touch down is palm */
  1515. litest_touch_down(dev, 0, 50, 80);
  1516. litest_touch_move_extended(dev, 0, 51, 99, axes);
  1517. litest_touch_up(dev, 0);
  1518. litest_timeout_tap(li);
  1519. litest_assert_empty_queue(li);
  1520. /* make sure normal tap still works */
  1521. litest_touch_down(dev, 0, 50, 99);
  1522. litest_touch_up(dev, 0);
  1523. litest_timeout_tap(li);
  1524. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  1525. }
  1526. END_TEST
  1527. START_TEST(touchpad_palm_detect_pressure_tap_hold)
  1528. {
  1529. struct litest_device *dev = litest_current_device();
  1530. struct libinput *li = dev->libinput;
  1531. struct axis_replacement axes[] = {
  1532. { ABS_MT_PRESSURE, 75 },
  1533. { -1, 0 },
  1534. };
  1535. if (!touchpad_has_palm_pressure(dev))
  1536. return LITEST_NOT_APPLICABLE;
  1537. litest_enable_tap(dev->libinput_device);
  1538. litest_enable_clickfinger(dev);
  1539. litest_disable_hold_gestures(dev->libinput_device);
  1540. litest_drain_events(li);
  1541. /* event in state HOLD is thumb */
  1542. litest_touch_down(dev, 0, 50, 99);
  1543. litest_timeout_tap(li);
  1544. litest_touch_move_extended(dev, 0, 51, 99, axes);
  1545. litest_touch_up(dev, 0);
  1546. litest_assert_empty_queue(li);
  1547. /* make sure normal tap still works */
  1548. litest_touch_down(dev, 0, 50, 99);
  1549. litest_touch_up(dev, 0);
  1550. litest_timeout_tap(li);
  1551. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  1552. }
  1553. END_TEST
  1554. START_TEST(touchpad_palm_detect_pressure_tap_hold_2ndfg)
  1555. {
  1556. struct litest_device *dev = litest_current_device();
  1557. struct libinput *li = dev->libinput;
  1558. struct axis_replacement axes[] = {
  1559. { ABS_MT_PRESSURE, 75 },
  1560. { -1, 0 },
  1561. };
  1562. if (!touchpad_has_palm_pressure(dev))
  1563. return LITEST_NOT_APPLICABLE;
  1564. litest_enable_tap(dev->libinput_device);
  1565. litest_enable_clickfinger(dev);
  1566. litest_disable_hold_gestures(dev->libinput_device);
  1567. litest_drain_events(li);
  1568. /* event in state HOLD is thumb */
  1569. litest_touch_down(dev, 0, 50, 99);
  1570. litest_timeout_tap(li);
  1571. litest_touch_move_extended(dev, 0, 51, 99, axes);
  1572. litest_assert_empty_queue(li);
  1573. /* one finger is a thumb, now get second finger down */
  1574. litest_touch_down(dev, 1, 60, 50);
  1575. litest_assert_empty_queue(li);
  1576. /* release thumb */
  1577. litest_touch_up(dev, 0);
  1578. litest_assert_empty_queue(li);
  1579. /* timeout -> into HOLD, no event on release */
  1580. litest_timeout_tap(li);
  1581. litest_touch_up(dev, 1);
  1582. litest_assert_empty_queue(li);
  1583. /* make sure normal tap still works */
  1584. litest_touch_down(dev, 0, 50, 99);
  1585. litest_touch_up(dev, 0);
  1586. litest_timeout_tap(li);
  1587. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  1588. }
  1589. END_TEST
  1590. START_TEST(touchpad_palm_detect_move_and_tap)
  1591. {
  1592. struct litest_device *dev = litest_current_device();
  1593. struct libinput *li = dev->libinput;
  1594. struct axis_replacement axes[] = {
  1595. { ABS_MT_PRESSURE, 75 },
  1596. { -1, 0 },
  1597. };
  1598. if (!touchpad_has_palm_pressure(dev))
  1599. return LITEST_NOT_APPLICABLE;
  1600. litest_enable_tap(dev->libinput_device);
  1601. litest_disable_hold_gestures(dev->libinput_device);
  1602. litest_drain_events(li);
  1603. /* trigger thumb detection by pressure after a slight movement */
  1604. litest_touch_down(dev, 0, 50, 99);
  1605. litest_touch_move(dev, 0, 51, 99);
  1606. litest_touch_move_extended(dev, 0, 55, 99, axes);
  1607. litest_dispatch(li);
  1608. litest_assert_empty_queue(li);
  1609. /* thumb is resting, check if tapping still works */
  1610. litest_touch_down(dev, 1, 50, 50);
  1611. litest_touch_up(dev, 1);
  1612. litest_timeout_tap(li);
  1613. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1614. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1615. litest_assert_empty_queue(li);
  1616. }
  1617. END_TEST
  1618. START_TEST(touchpad_palm_detect_pressure_late)
  1619. {
  1620. struct litest_device *dev = litest_current_device();
  1621. struct libinput *li = dev->libinput;
  1622. struct axis_replacement axes[] = {
  1623. { ABS_MT_PRESSURE, 75 },
  1624. { -1, 0 },
  1625. };
  1626. if (!touchpad_has_palm_pressure(dev))
  1627. return LITEST_NOT_APPLICABLE;
  1628. litest_disable_tap(dev->libinput_device);
  1629. litest_disable_hold_gestures(dev->libinput_device);
  1630. litest_drain_events(li);
  1631. litest_touch_down(dev, 0, 50, 50);
  1632. litest_touch_move_to(dev, 0, 50, 70, 80, 90, 10);
  1633. litest_drain_events(li);
  1634. litest_dispatch(li);
  1635. litest_touch_move_to_extended(dev, 0, 80, 90, 50, 20, axes, 10);
  1636. litest_touch_up(dev, 0);
  1637. litest_assert_empty_queue(li);
  1638. }
  1639. END_TEST
  1640. START_TEST(touchpad_palm_detect_pressure_keep_palm)
  1641. {
  1642. struct litest_device *dev = litest_current_device();
  1643. struct libinput *li = dev->libinput;
  1644. struct axis_replacement axes[] = {
  1645. { ABS_MT_PRESSURE, 75 },
  1646. { -1, 0 },
  1647. };
  1648. if (!touchpad_has_palm_pressure(dev))
  1649. return LITEST_NOT_APPLICABLE;
  1650. litest_disable_tap(dev->libinput_device);
  1651. litest_disable_hold_gestures(dev->libinput_device);
  1652. litest_drain_events(li);
  1653. litest_touch_down(dev, 0, 80, 90);
  1654. litest_touch_move_to_extended(dev, 0, 80, 90, 50, 20, axes, 10);
  1655. litest_touch_move_to(dev, 0, 50, 20, 80, 90, 10);
  1656. litest_touch_up(dev, 0);
  1657. litest_assert_empty_queue(li);
  1658. }
  1659. END_TEST
  1660. START_TEST(touchpad_palm_detect_pressure_after_edge)
  1661. {
  1662. struct litest_device *dev = litest_current_device();
  1663. struct libinput *li = dev->libinput;
  1664. struct axis_replacement axes[] = {
  1665. { ABS_MT_PRESSURE, 75 },
  1666. { -1, 0 },
  1667. };
  1668. if (!touchpad_has_palm_pressure(dev) || !litest_has_palm_detect_size(dev) ||
  1669. !litest_has_2fg_scroll(dev))
  1670. return LITEST_NOT_APPLICABLE;
  1671. litest_enable_2fg_scroll(dev);
  1672. litest_disable_tap(dev->libinput_device);
  1673. litest_disable_hold_gestures(dev->libinput_device);
  1674. litest_drain_events(li);
  1675. litest_touch_down(dev, 0, 99, 50);
  1676. litest_touch_move_to_extended(dev, 0, 99, 50, 20, 50, axes, 20);
  1677. litest_touch_up(dev, 0);
  1678. litest_dispatch(li);
  1679. litest_assert_empty_queue(li);
  1680. }
  1681. END_TEST
  1682. START_TEST(touchpad_palm_detect_pressure_after_dwt)
  1683. {
  1684. struct litest_device *touchpad = litest_current_device();
  1685. struct litest_device *keyboard;
  1686. struct libinput *li = touchpad->libinput;
  1687. struct axis_replacement axes[] = {
  1688. { ABS_MT_PRESSURE, 75 },
  1689. { -1, 0 },
  1690. };
  1691. if (!touchpad_has_palm_pressure(touchpad))
  1692. return LITEST_NOT_APPLICABLE;
  1693. keyboard = dwt_init_paired_keyboard(li, touchpad);
  1694. litest_disable_tap(touchpad->libinput_device);
  1695. litest_disable_hold_gestures(touchpad->libinput_device);
  1696. litest_drain_events(li);
  1697. litest_keyboard_key(keyboard, KEY_A, true);
  1698. litest_keyboard_key(keyboard, KEY_A, false);
  1699. litest_drain_events(li);
  1700. /* within dwt timeout, dwt blocks events */
  1701. litest_touch_down(touchpad, 0, 50, 50);
  1702. litest_touch_move_to_extended(touchpad, 0, 50, 50, 20, 50, axes, 20);
  1703. litest_assert_empty_queue(li);
  1704. litest_timeout_dwt_short(li);
  1705. litest_assert_empty_queue(li);
  1706. /* after dwt timeout, pressure blocks events */
  1707. litest_touch_move_to_extended(touchpad, 0, 20, 50, 50, 50, axes, 20);
  1708. litest_touch_up(touchpad, 0);
  1709. litest_assert_empty_queue(li);
  1710. litest_device_destroy(keyboard);
  1711. }
  1712. END_TEST
  1713. START_TEST(touchpad_palm_ignore_threshold_zero)
  1714. {
  1715. struct litest_device *dev = litest_current_device();
  1716. struct libinput *li = dev->libinput;
  1717. struct axis_replacement axes[] = {
  1718. { ABS_MT_PRESSURE, 75 },
  1719. { -1, 0 },
  1720. };
  1721. litest_disable_tap(dev->libinput_device);
  1722. litest_disable_hold_gestures(dev->libinput_device);
  1723. litest_drain_events(li);
  1724. litest_touch_down_extended(dev, 0, 50, 99, axes);
  1725. litest_touch_move_to(dev, 0, 50, 50, 80, 99, 10);
  1726. litest_touch_up(dev, 0);
  1727. litest_dispatch(li);
  1728. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  1729. }
  1730. END_TEST
  1731. START_TEST(touchpad_palm_clickfinger_pressure)
  1732. {
  1733. struct litest_device *dev = litest_current_device();
  1734. struct libinput *li = dev->libinput;
  1735. struct axis_replacement axes[] = {
  1736. { ABS_MT_PRESSURE, 75 },
  1737. { -1, 0 },
  1738. };
  1739. if (!touchpad_has_palm_pressure(dev))
  1740. return LITEST_NOT_APPLICABLE;
  1741. litest_enable_clickfinger(dev);
  1742. litest_disable_tap(dev->libinput_device);
  1743. litest_disable_hold_gestures(dev->libinput_device);
  1744. litest_drain_events(li);
  1745. litest_touch_down_extended(dev, 0, 50, 95, axes);
  1746. litest_touch_down(dev, 1, 50, 50);
  1747. litest_button_click(dev, BTN_LEFT, true);
  1748. litest_button_click(dev, BTN_LEFT, false);
  1749. litest_touch_up(dev, 1);
  1750. litest_touch_up(dev, 0);
  1751. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1752. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1753. litest_assert_empty_queue(li);
  1754. }
  1755. END_TEST
  1756. START_TEST(touchpad_palm_clickfinger_pressure_2fg)
  1757. {
  1758. struct litest_device *dev = litest_current_device();
  1759. struct libinput *li = dev->libinput;
  1760. struct axis_replacement axes[] = {
  1761. { ABS_MT_PRESSURE, 75 },
  1762. { -1, 0 },
  1763. };
  1764. if (!touchpad_has_palm_pressure(dev))
  1765. return LITEST_NOT_APPLICABLE;
  1766. if (libevdev_get_num_slots(dev->evdev) < 3)
  1767. return LITEST_NOT_APPLICABLE;
  1768. litest_enable_clickfinger(dev);
  1769. litest_disable_tap(dev->libinput_device);
  1770. litest_disable_hold_gestures(dev->libinput_device);
  1771. litest_drain_events(li);
  1772. litest_touch_down_extended(dev, 0, 50, 95, axes);
  1773. litest_touch_down(dev, 1, 50, 50);
  1774. litest_touch_down(dev, 2, 50, 60);
  1775. litest_button_click(dev, BTN_LEFT, true);
  1776. litest_button_click(dev, BTN_LEFT, false);
  1777. litest_touch_up(dev, 1);
  1778. litest_touch_up(dev, 2);
  1779. litest_touch_up(dev, 0);
  1780. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1781. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1782. litest_assert_empty_queue(li);
  1783. }
  1784. END_TEST
  1785. static inline bool
  1786. touchpad_has_touch_size(struct litest_device *dev)
  1787. {
  1788. struct libevdev *evdev = dev->evdev;
  1789. if (!libevdev_has_event_code(evdev, EV_ABS, ABS_MT_TOUCH_MAJOR))
  1790. return false;
  1791. if (libevdev_get_id_vendor(evdev) == VENDOR_ID_APPLE)
  1792. return true;
  1793. return false;
  1794. }
  1795. START_TEST(touchpad_palm_clickfinger_size)
  1796. {
  1797. struct litest_device *dev = litest_current_device();
  1798. struct libinput *li = dev->libinput;
  1799. struct axis_replacement axes[] = {
  1800. { ABS_MT_TOUCH_MAJOR, 0 },
  1801. { ABS_MT_TOUCH_MINOR, 0 },
  1802. { ABS_MT_ORIENTATION, 0 },
  1803. { -1, 0 },
  1804. };
  1805. if (!touchpad_has_touch_size(dev))
  1806. return LITEST_NOT_APPLICABLE;
  1807. litest_enable_clickfinger(dev);
  1808. litest_disable_tap(dev->libinput_device);
  1809. litest_disable_hold_gestures(dev->libinput_device);
  1810. litest_drain_events(li);
  1811. litest_touch_down_extended(dev, 0, 50, 95, axes);
  1812. litest_touch_down(dev, 1, 50, 50);
  1813. litest_button_click(dev, BTN_LEFT, true);
  1814. litest_button_click(dev, BTN_LEFT, false);
  1815. litest_touch_up(dev, 1);
  1816. litest_touch_up(dev, 0);
  1817. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1818. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1819. litest_assert_empty_queue(li);
  1820. }
  1821. END_TEST
  1822. START_TEST(touchpad_palm_clickfinger_size_2fg)
  1823. {
  1824. struct litest_device *dev = litest_current_device();
  1825. struct libinput *li = dev->libinput;
  1826. struct axis_replacement axes[] = {
  1827. { ABS_MT_TOUCH_MAJOR, 0 },
  1828. { ABS_MT_TOUCH_MINOR, 0 },
  1829. { ABS_MT_ORIENTATION, 0 },
  1830. { -1, 0 },
  1831. };
  1832. if (!touchpad_has_touch_size(dev))
  1833. return LITEST_NOT_APPLICABLE;
  1834. if (libevdev_get_num_slots(dev->evdev) < 3)
  1835. return LITEST_NOT_APPLICABLE;
  1836. litest_enable_clickfinger(dev);
  1837. litest_disable_tap(dev->libinput_device);
  1838. litest_disable_hold_gestures(dev->libinput_device);
  1839. litest_drain_events(li);
  1840. litest_touch_down_extended(dev, 0, 50, 95, axes);
  1841. litest_touch_down(dev, 1, 50, 50);
  1842. litest_touch_down(dev, 2, 50, 60);
  1843. litest_button_click(dev, BTN_LEFT, true);
  1844. litest_button_click(dev, BTN_LEFT, false);
  1845. litest_touch_up(dev, 1);
  1846. litest_touch_up(dev, 2);
  1847. litest_touch_up(dev, 0);
  1848. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1849. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1850. litest_assert_empty_queue(li);
  1851. }
  1852. END_TEST
  1853. START_TEST(touchpad_left_handed)
  1854. {
  1855. struct litest_device *dev = litest_current_device();
  1856. struct libinput_device *d = dev->libinput_device;
  1857. struct libinput *li = dev->libinput;
  1858. enum libinput_config_status status;
  1859. if (libevdev_get_id_vendor(dev->evdev) == VENDOR_ID_APPLE &&
  1860. libevdev_get_id_product(dev->evdev) == PRODUCT_ID_APPLE_APPLETOUCH)
  1861. return LITEST_NOT_APPLICABLE;
  1862. status = libinput_device_config_left_handed_set(d, 1);
  1863. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  1864. litest_drain_events(li);
  1865. litest_button_click(dev, BTN_LEFT, 1);
  1866. litest_button_click(dev, BTN_LEFT, 0);
  1867. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1868. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1869. litest_button_click(dev, BTN_RIGHT, 1);
  1870. litest_button_click(dev, BTN_RIGHT, 0);
  1871. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1872. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1873. if (libevdev_has_event_code(dev->evdev, EV_KEY, BTN_MIDDLE)) {
  1874. litest_button_click(dev, BTN_MIDDLE, 1);
  1875. litest_button_click(dev, BTN_MIDDLE, 0);
  1876. litest_assert_button_event(li,
  1877. BTN_MIDDLE,
  1878. LIBINPUT_BUTTON_STATE_PRESSED);
  1879. litest_assert_button_event(li,
  1880. BTN_MIDDLE,
  1881. LIBINPUT_BUTTON_STATE_RELEASED);
  1882. }
  1883. }
  1884. END_TEST
  1885. START_TEST(touchpad_left_handed_appletouch)
  1886. {
  1887. struct litest_device *dev = litest_current_device();
  1888. struct libinput_device *d = dev->libinput_device;
  1889. enum libinput_config_status status;
  1890. litest_assert_int_eq(libinput_device_config_left_handed_is_available(d), 0);
  1891. status = libinput_device_config_left_handed_set(d, 1);
  1892. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
  1893. litest_assert_int_eq(libinput_device_config_left_handed_get(d), 0);
  1894. }
  1895. END_TEST
  1896. START_TEST(touchpad_left_handed_clickpad)
  1897. {
  1898. struct litest_device *dev = litest_current_device();
  1899. struct libinput_device *d = dev->libinput_device;
  1900. struct libinput *li = dev->libinput;
  1901. enum libinput_config_status status;
  1902. if (!libinput_device_config_left_handed_is_available(d))
  1903. return LITEST_NOT_APPLICABLE;
  1904. status = libinput_device_config_left_handed_set(d, 1);
  1905. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  1906. litest_drain_events(li);
  1907. litest_touch_down(dev, 0, 10, 90);
  1908. litest_button_click(dev, BTN_LEFT, 1);
  1909. litest_button_click(dev, BTN_LEFT, 0);
  1910. litest_touch_up(dev, 0);
  1911. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1912. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1913. litest_drain_events(li);
  1914. litest_touch_down(dev, 0, 90, 90);
  1915. litest_button_click(dev, BTN_LEFT, 1);
  1916. litest_button_click(dev, BTN_LEFT, 0);
  1917. litest_touch_up(dev, 0);
  1918. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1919. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1920. litest_drain_events(li);
  1921. litest_touch_down(dev, 0, 50, 50);
  1922. litest_button_click(dev, BTN_LEFT, 1);
  1923. litest_button_click(dev, BTN_LEFT, 0);
  1924. litest_touch_up(dev, 0);
  1925. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1926. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1927. }
  1928. END_TEST
  1929. START_TEST(touchpad_left_handed_clickfinger)
  1930. {
  1931. struct litest_device *dev = litest_current_device();
  1932. struct libinput_device *d = dev->libinput_device;
  1933. struct libinput *li = dev->libinput;
  1934. enum libinput_config_status status;
  1935. if (!libinput_device_config_left_handed_is_available(d))
  1936. return LITEST_NOT_APPLICABLE;
  1937. status = libinput_device_config_left_handed_set(d, 1);
  1938. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  1939. litest_drain_events(li);
  1940. litest_touch_down(dev, 0, 10, 90);
  1941. litest_button_click(dev, BTN_LEFT, 1);
  1942. litest_button_click(dev, BTN_LEFT, 0);
  1943. litest_touch_up(dev, 0);
  1944. /* Clickfinger is unaffected by left-handed setting */
  1945. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1946. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1947. litest_drain_events(li);
  1948. litest_touch_down(dev, 0, 10, 90);
  1949. litest_touch_down(dev, 1, 30, 90);
  1950. litest_button_click(dev, BTN_LEFT, 1);
  1951. litest_button_click(dev, BTN_LEFT, 0);
  1952. litest_touch_up(dev, 0);
  1953. litest_touch_up(dev, 1);
  1954. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1955. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  1956. }
  1957. END_TEST
  1958. START_TEST(touchpad_left_handed_tapping)
  1959. {
  1960. struct litest_device *dev = litest_current_device();
  1961. struct libinput_device *d = dev->libinput_device;
  1962. struct libinput *li = dev->libinput;
  1963. enum libinput_config_status status;
  1964. if (!libinput_device_config_left_handed_is_available(d))
  1965. return LITEST_NOT_APPLICABLE;
  1966. litest_enable_tap(dev->libinput_device);
  1967. litest_disable_hold_gestures(dev->libinput_device);
  1968. status = libinput_device_config_left_handed_set(d, 1);
  1969. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  1970. litest_drain_events(li);
  1971. litest_touch_down(dev, 0, 50, 50);
  1972. litest_touch_up(dev, 0);
  1973. litest_timeout_tap(li);
  1974. /* Tapping is unaffected by left-handed setting */
  1975. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  1976. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  1977. }
  1978. END_TEST
  1979. START_TEST(touchpad_left_handed_tapping_2fg)
  1980. {
  1981. struct litest_device *dev = litest_current_device();
  1982. struct libinput_device *d = dev->libinput_device;
  1983. struct libinput *li = dev->libinput;
  1984. enum libinput_config_status status;
  1985. if (!libinput_device_config_left_handed_is_available(d))
  1986. return LITEST_NOT_APPLICABLE;
  1987. litest_enable_tap(dev->libinput_device);
  1988. litest_disable_hold_gestures(dev->libinput_device);
  1989. status = libinput_device_config_left_handed_set(d, 1);
  1990. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  1991. litest_drain_events(li);
  1992. litest_touch_down(dev, 0, 50, 50);
  1993. litest_touch_down(dev, 1, 70, 50);
  1994. litest_touch_up(dev, 1);
  1995. litest_touch_up(dev, 0);
  1996. litest_timeout_tap(li);
  1997. /* Tapping is unaffected by left-handed setting */
  1998. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  1999. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  2000. }
  2001. END_TEST
  2002. START_TEST(touchpad_left_handed_delayed)
  2003. {
  2004. struct litest_device *dev = litest_current_device();
  2005. struct libinput_device *d = dev->libinput_device;
  2006. struct libinput *li = dev->libinput;
  2007. enum libinput_config_status status;
  2008. if (!libinput_device_config_left_handed_is_available(d))
  2009. return LITEST_NOT_APPLICABLE;
  2010. litest_drain_events(li);
  2011. litest_button_click(dev, BTN_LEFT, 1);
  2012. litest_dispatch(li);
  2013. status = libinput_device_config_left_handed_set(d, 1);
  2014. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  2015. litest_button_click(dev, BTN_LEFT, 0);
  2016. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  2017. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  2018. /* left-handed takes effect now */
  2019. litest_button_click(dev, BTN_RIGHT, 1);
  2020. litest_timeout_middlebutton(li);
  2021. litest_button_click(dev, BTN_LEFT, 1);
  2022. litest_dispatch(li);
  2023. status = libinput_device_config_left_handed_set(d, 0);
  2024. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  2025. litest_button_click(dev, BTN_RIGHT, 0);
  2026. litest_button_click(dev, BTN_LEFT, 0);
  2027. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  2028. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  2029. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  2030. litest_assert_button_event(li, BTN_RIGHT, LIBINPUT_BUTTON_STATE_RELEASED);
  2031. }
  2032. END_TEST
  2033. START_TEST(touchpad_left_handed_clickpad_delayed)
  2034. {
  2035. struct litest_device *dev = litest_current_device();
  2036. struct libinput_device *d = dev->libinput_device;
  2037. struct libinput *li = dev->libinput;
  2038. enum libinput_config_status status;
  2039. if (!libinput_device_config_left_handed_is_available(d))
  2040. return LITEST_NOT_APPLICABLE;
  2041. litest_drain_events(li);
  2042. litest_touch_down(dev, 0, 10, 90);
  2043. litest_button_click(dev, BTN_LEFT, 1);
  2044. litest_dispatch(li);
  2045. status = libinput_device_config_left_handed_set(d, 1);
  2046. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  2047. litest_button_click(dev, BTN_LEFT, 0);
  2048. litest_touch_up(dev, 0);
  2049. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  2050. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  2051. /* left-handed takes effect now */
  2052. litest_drain_events(li);
  2053. litest_touch_down(dev, 0, 90, 90);
  2054. litest_button_click(dev, BTN_LEFT, 1);
  2055. litest_dispatch(li);
  2056. status = libinput_device_config_left_handed_set(d, 0);
  2057. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  2058. litest_button_click(dev, BTN_LEFT, 0);
  2059. litest_touch_up(dev, 0);
  2060. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  2061. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  2062. }
  2063. END_TEST
  2064. #ifdef HAVE_LIBWACOM
  2065. static inline bool
  2066. touchpad_has_rotation(struct libevdev *evdev)
  2067. {
  2068. return libevdev_get_id_vendor(evdev) == VENDOR_ID_WACOM;
  2069. }
  2070. #endif /* HAVE_LIBWACOM */
  2071. START_TEST(touchpad_left_handed_rotation)
  2072. {
  2073. #ifdef HAVE_LIBWACOM
  2074. struct litest_device *dev = litest_current_device();
  2075. struct libinput_device *d = dev->libinput_device;
  2076. struct libinput *li = dev->libinput;
  2077. enum libinput_config_status status;
  2078. struct libinput_event *event;
  2079. bool rotate = touchpad_has_rotation(dev->evdev);
  2080. if (!libinput_device_config_left_handed_is_available(d))
  2081. return LITEST_NOT_APPLICABLE;
  2082. status = libinput_device_config_left_handed_set(d, 1);
  2083. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  2084. litest_drain_events(li);
  2085. litest_touch_down(dev, 0, 20, 80);
  2086. litest_touch_move_to(dev, 0, 20, 80, 80, 20, 20);
  2087. litest_touch_up(dev, 0);
  2088. litest_dispatch(li);
  2089. event = libinput_get_event(li);
  2090. litest_assert_notnull(event);
  2091. do {
  2092. struct libinput_event_pointer *p;
  2093. double x, y, ux, uy;
  2094. p = litest_is_motion_event(event);
  2095. x = libinput_event_pointer_get_dx(p);
  2096. y = libinput_event_pointer_get_dy(p);
  2097. ux = libinput_event_pointer_get_dx_unaccelerated(p);
  2098. uy = libinput_event_pointer_get_dy_unaccelerated(p);
  2099. if (rotate) {
  2100. litest_assert_double_lt(x, 0);
  2101. litest_assert_double_gt(y, 0);
  2102. litest_assert_double_lt(ux, 0);
  2103. litest_assert_double_gt(uy, 0);
  2104. } else {
  2105. litest_assert_double_gt(x, 0);
  2106. litest_assert_double_lt(y, 0);
  2107. litest_assert_double_gt(ux, 0);
  2108. litest_assert_double_lt(uy, 0);
  2109. }
  2110. libinput_event_destroy(event);
  2111. } while ((event = libinput_get_event(li)));
  2112. #endif
  2113. }
  2114. END_TEST
  2115. static void
  2116. hover_continue(struct litest_device *dev, unsigned int slot, int x, int y)
  2117. {
  2118. litest_event(dev, EV_ABS, ABS_MT_SLOT, slot);
  2119. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2120. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2121. litest_event(dev, EV_ABS, ABS_X, x);
  2122. litest_event(dev, EV_ABS, ABS_Y, y);
  2123. litest_event(dev, EV_ABS, ABS_PRESSURE, 10);
  2124. litest_event(dev, EV_ABS, ABS_TOOL_WIDTH, 6);
  2125. /* WARNING: no SYN_REPORT! */
  2126. }
  2127. static void
  2128. hover_start(struct litest_device *dev, unsigned int slot, int x, int y)
  2129. {
  2130. static unsigned int tracking_id;
  2131. litest_event(dev, EV_ABS, ABS_MT_SLOT, slot);
  2132. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, ++tracking_id);
  2133. hover_continue(dev, slot, x, y);
  2134. /* WARNING: no SYN_REPORT! */
  2135. }
  2136. START_TEST(touchpad_semi_mt_hover_noevent)
  2137. {
  2138. struct litest_device *dev = litest_current_device();
  2139. struct libinput *li = dev->libinput;
  2140. int i;
  2141. int x = 2400, y = 2400;
  2142. litest_drain_events(li);
  2143. hover_start(dev, 0, x, y);
  2144. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  2145. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2146. for (i = 0; i < 10; i++) {
  2147. x += 200;
  2148. y -= 200;
  2149. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2150. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2151. litest_event(dev, EV_ABS, ABS_X, x);
  2152. litest_event(dev, EV_ABS, ABS_Y, y);
  2153. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2154. }
  2155. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2156. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2157. litest_assert_empty_queue(li);
  2158. }
  2159. END_TEST
  2160. START_TEST(touchpad_semi_mt_hover_down)
  2161. {
  2162. struct litest_device *dev = litest_current_device();
  2163. struct libinput *li = dev->libinput;
  2164. struct libinput_event *event;
  2165. int i;
  2166. int x = 2400, y = 2400;
  2167. litest_drain_events(li);
  2168. hover_start(dev, 0, x, y);
  2169. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  2170. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2171. for (i = 0; i < 10; i++) {
  2172. x += 200;
  2173. y -= 200;
  2174. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2175. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2176. litest_event(dev, EV_ABS, ABS_X, x);
  2177. litest_event(dev, EV_ABS, ABS_Y, y);
  2178. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2179. }
  2180. litest_assert_empty_queue(li);
  2181. litest_event(dev, EV_ABS, ABS_X, x + 100);
  2182. litest_event(dev, EV_ABS, ABS_Y, y + 100);
  2183. litest_event(dev, EV_ABS, ABS_PRESSURE, 50);
  2184. litest_event(dev, EV_KEY, BTN_TOUCH, 1);
  2185. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2186. litest_dispatch(li);
  2187. for (i = 0; i < 10; i++) {
  2188. x -= 200;
  2189. y += 200;
  2190. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2191. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2192. litest_event(dev, EV_ABS, ABS_X, x);
  2193. litest_event(dev, EV_ABS, ABS_Y, y);
  2194. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2195. }
  2196. litest_dispatch(li);
  2197. litest_wait_for_event(li);
  2198. while ((event = libinput_get_event(li)) != NULL) {
  2199. litest_assert_event_type(event, LIBINPUT_EVENT_POINTER_MOTION);
  2200. libinput_event_destroy(event);
  2201. litest_dispatch(li);
  2202. }
  2203. /* go back to hover */
  2204. hover_continue(dev, 0, x, y);
  2205. litest_event(dev, EV_ABS, ABS_PRESSURE, 0);
  2206. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  2207. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2208. for (i = 0; i < 10; i++) {
  2209. x += 200;
  2210. y -= 200;
  2211. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2212. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2213. litest_event(dev, EV_ABS, ABS_X, x);
  2214. litest_event(dev, EV_ABS, ABS_Y, y);
  2215. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2216. }
  2217. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2218. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2219. litest_assert_empty_queue(li);
  2220. }
  2221. END_TEST
  2222. START_TEST(touchpad_semi_mt_hover_down_hover_down)
  2223. {
  2224. struct litest_device *dev = litest_current_device();
  2225. struct libinput *li = dev->libinput;
  2226. int i, j;
  2227. int x = 1400, y = 1400;
  2228. litest_drain_events(li);
  2229. /* hover */
  2230. hover_start(dev, 0, x, y);
  2231. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  2232. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2233. litest_assert_empty_queue(li);
  2234. for (i = 0; i < 3; i++) {
  2235. /* touch */
  2236. litest_event(dev, EV_ABS, ABS_X, x + 100);
  2237. litest_event(dev, EV_ABS, ABS_Y, y + 100);
  2238. litest_event(dev, EV_ABS, ABS_PRESSURE, 50);
  2239. litest_event(dev, EV_KEY, BTN_TOUCH, 1);
  2240. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2241. litest_dispatch(li);
  2242. for (j = 0; j < 5; j++) {
  2243. x += 200;
  2244. y += 200;
  2245. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2246. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2247. litest_event(dev, EV_ABS, ABS_X, x);
  2248. litest_event(dev, EV_ABS, ABS_Y, y);
  2249. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2250. }
  2251. litest_dispatch(li);
  2252. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2253. /* go back to hover */
  2254. hover_continue(dev, 0, x, y);
  2255. litest_event(dev, EV_ABS, ABS_PRESSURE, 0);
  2256. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  2257. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2258. for (j = 0; j < 5; j++) {
  2259. x -= 200;
  2260. y -= 200;
  2261. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2262. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2263. litest_event(dev, EV_ABS, ABS_X, x);
  2264. litest_event(dev, EV_ABS, ABS_Y, y);
  2265. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2266. }
  2267. litest_assert_empty_queue(li);
  2268. }
  2269. /* touch */
  2270. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2271. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2272. litest_assert_empty_queue(li);
  2273. /* start a new touch to be sure */
  2274. litest_push_event_frame(dev);
  2275. litest_touch_down(dev, 0, 50, 50);
  2276. litest_event(dev, EV_ABS, ABS_PRESSURE, 50);
  2277. litest_pop_event_frame(dev);
  2278. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  2279. litest_touch_up(dev, 0);
  2280. litest_dispatch(li);
  2281. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2282. }
  2283. END_TEST
  2284. START_TEST(touchpad_semi_mt_hover_down_up)
  2285. {
  2286. struct litest_device *dev = litest_current_device();
  2287. struct libinput *li = dev->libinput;
  2288. int i;
  2289. int x = 1400, y = 1400;
  2290. litest_drain_events(li);
  2291. /* hover two fingers, then touch */
  2292. hover_start(dev, 0, x, y);
  2293. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  2294. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2295. litest_assert_empty_queue(li);
  2296. hover_start(dev, 1, x, y);
  2297. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2298. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  2299. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2300. litest_assert_empty_queue(li);
  2301. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  2302. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  2303. litest_event(dev, EV_KEY, BTN_TOUCH, 1);
  2304. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2305. litest_assert_empty_queue(li);
  2306. /* hover first finger, end second in same frame */
  2307. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  2308. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  2309. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  2310. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  2311. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  2312. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2313. litest_assert_empty_queue(li);
  2314. litest_event(dev, EV_ABS, ABS_PRESSURE, 50);
  2315. litest_event(dev, EV_KEY, BTN_TOUCH, 1);
  2316. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2317. litest_dispatch(li);
  2318. /* now move the finger */
  2319. for (i = 0; i < 10; i++) {
  2320. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  2321. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2322. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2323. litest_event(dev, EV_ABS, ABS_X, x);
  2324. litest_event(dev, EV_ABS, ABS_Y, y);
  2325. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2326. x -= 100;
  2327. y -= 100;
  2328. }
  2329. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2330. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  2331. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  2332. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2333. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  2334. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2335. litest_dispatch(li);
  2336. }
  2337. END_TEST
  2338. START_TEST(touchpad_semi_mt_hover_2fg_noevent)
  2339. {
  2340. struct litest_device *dev = litest_current_device();
  2341. struct libinput *li = dev->libinput;
  2342. int i;
  2343. int x = 2400, y = 2400;
  2344. litest_drain_events(li);
  2345. hover_start(dev, 0, x, y);
  2346. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  2347. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2348. hover_start(dev, 1, x + 500, y + 500);
  2349. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2350. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  2351. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2352. for (i = 0; i < 10; i++) {
  2353. x += 200;
  2354. y -= 200;
  2355. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  2356. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2357. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2358. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  2359. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x + 500);
  2360. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y + 500);
  2361. litest_event(dev, EV_ABS, ABS_X, x);
  2362. litest_event(dev, EV_ABS, ABS_Y, y);
  2363. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2364. }
  2365. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  2366. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2367. litest_assert_empty_queue(li);
  2368. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2369. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2370. litest_assert_empty_queue(li);
  2371. }
  2372. END_TEST
  2373. START_TEST(touchpad_semi_mt_hover_2fg_1fg_down)
  2374. {
  2375. struct litest_device *dev = litest_current_device();
  2376. struct libinput *li = dev->libinput;
  2377. int i;
  2378. int x = 2400, y = 2400;
  2379. litest_drain_events(li);
  2380. /* two slots active, but BTN_TOOL_FINGER only */
  2381. hover_start(dev, 0, x, y);
  2382. hover_start(dev, 1, x + 500, y + 500);
  2383. litest_event(dev, EV_ABS, ABS_PRESSURE, 50);
  2384. litest_event(dev, EV_KEY, BTN_TOUCH, 1);
  2385. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  2386. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2387. for (i = 0; i < 10; i++) {
  2388. x += 200;
  2389. y -= 200;
  2390. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  2391. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
  2392. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
  2393. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  2394. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x + 500);
  2395. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y + 500);
  2396. litest_event(dev, EV_ABS, ABS_X, x);
  2397. litest_event(dev, EV_ABS, ABS_Y, y);
  2398. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2399. }
  2400. litest_event(dev, EV_ABS, ABS_PRESSURE, 0);
  2401. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  2402. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  2403. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2404. litest_dispatch(li);
  2405. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2406. }
  2407. END_TEST
  2408. START_TEST(touchpad_semi_mt_hover_2fg_up)
  2409. {
  2410. struct litest_device *dev = litest_current_device();
  2411. struct libinput *li = dev->libinput;
  2412. litest_touch_down(dev, 0, 70, 50);
  2413. litest_touch_down(dev, 1, 50, 50);
  2414. litest_push_event_frame(dev);
  2415. litest_touch_move(dev, 0, 72, 50);
  2416. litest_touch_move(dev, 1, 52, 50);
  2417. litest_event(dev, EV_ABS, ABS_PRESSURE, 0);
  2418. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  2419. litest_pop_event_frame(dev);
  2420. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  2421. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  2422. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  2423. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  2424. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  2425. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  2426. litest_drain_events(li);
  2427. }
  2428. END_TEST
  2429. START_TEST(touchpad_hover_noevent)
  2430. {
  2431. struct litest_device *dev = litest_current_device();
  2432. struct libinput *li = dev->libinput;
  2433. litest_drain_events(li);
  2434. litest_hover_start(dev, 0, 50, 50);
  2435. litest_hover_move_to(dev, 0, 50, 50, 70, 70, 10);
  2436. litest_hover_end(dev, 0);
  2437. litest_assert_empty_queue(li);
  2438. }
  2439. END_TEST
  2440. START_TEST(touchpad_hover_down)
  2441. {
  2442. struct litest_device *dev = litest_current_device();
  2443. struct libinput *li = dev->libinput;
  2444. litest_drain_events(li);
  2445. /* hover the finger */
  2446. litest_hover_start(dev, 0, 50, 50);
  2447. litest_hover_move_to(dev, 0, 50, 50, 70, 70, 10);
  2448. litest_assert_empty_queue(li);
  2449. /* touch the finger on the sensor */
  2450. litest_touch_move_to(dev, 0, 70, 70, 50, 50, 10);
  2451. litest_dispatch(li);
  2452. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2453. /* go back to hover */
  2454. litest_hover_move_to(dev, 0, 50, 50, 70, 70, 10);
  2455. litest_hover_end(dev, 0);
  2456. litest_assert_empty_queue(li);
  2457. }
  2458. END_TEST
  2459. START_TEST(touchpad_hover_down_hover_down)
  2460. {
  2461. struct litest_device *dev = litest_current_device();
  2462. struct libinput *li = dev->libinput;
  2463. int i;
  2464. litest_drain_events(li);
  2465. litest_hover_start(dev, 0, 50, 50);
  2466. for (i = 0; i < 3; i++) {
  2467. /* hover the finger */
  2468. litest_hover_move_to(dev, 0, 50, 50, 70, 70, 10);
  2469. litest_assert_empty_queue(li);
  2470. /* touch the finger */
  2471. litest_touch_move_to(dev, 0, 70, 70, 50, 50, 10);
  2472. litest_dispatch(li);
  2473. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2474. }
  2475. litest_hover_end(dev, 0);
  2476. /* start a new touch to be sure */
  2477. litest_touch_down(dev, 0, 50, 50);
  2478. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  2479. litest_touch_up(dev, 0);
  2480. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2481. }
  2482. END_TEST
  2483. START_TEST(touchpad_hover_down_up)
  2484. {
  2485. struct litest_device *dev = litest_current_device();
  2486. struct libinput *li = dev->libinput;
  2487. litest_drain_events(li);
  2488. /* hover two fingers, and a touch */
  2489. litest_push_event_frame(dev);
  2490. litest_hover_start(dev, 0, 50, 50);
  2491. litest_hover_start(dev, 1, 50, 50);
  2492. litest_touch_down(dev, 2, 50, 50);
  2493. litest_pop_event_frame(dev);
  2494. litest_assert_empty_queue(li);
  2495. /* hover first finger, end second and third in same frame */
  2496. litest_push_event_frame(dev);
  2497. litest_hover_move(dev, 0, 55, 55);
  2498. litest_hover_end(dev, 1);
  2499. litest_touch_up(dev, 2);
  2500. litest_pop_event_frame(dev);
  2501. litest_assert_empty_queue(li);
  2502. /* now move the finger */
  2503. litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10);
  2504. litest_touch_up(dev, 0);
  2505. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2506. }
  2507. END_TEST
  2508. START_TEST(touchpad_hover_2fg_noevent)
  2509. {
  2510. struct litest_device *dev = litest_current_device();
  2511. struct libinput *li = dev->libinput;
  2512. litest_drain_events(li);
  2513. /* hover two fingers */
  2514. litest_push_event_frame(dev);
  2515. litest_hover_start(dev, 0, 25, 25);
  2516. litest_hover_start(dev, 1, 50, 50);
  2517. litest_pop_event_frame(dev);
  2518. litest_hover_move_two_touches(dev, 25, 25, 50, 50, 50, 50, 10);
  2519. litest_push_event_frame(dev);
  2520. litest_hover_end(dev, 0);
  2521. litest_hover_end(dev, 1);
  2522. litest_pop_event_frame(dev);
  2523. litest_assert_empty_queue(li);
  2524. }
  2525. END_TEST
  2526. START_TEST(touchpad_hover_2fg_1fg_down)
  2527. {
  2528. struct litest_device *dev = litest_current_device();
  2529. struct libinput *li = dev->libinput;
  2530. int i;
  2531. litest_drain_events(li);
  2532. /* hover two fingers */
  2533. litest_push_event_frame(dev);
  2534. litest_hover_start(dev, 0, 25, 25);
  2535. litest_touch_down(dev, 1, 50, 50);
  2536. litest_pop_event_frame(dev);
  2537. for (i = 0; i < 10; i++) {
  2538. litest_push_event_frame(dev);
  2539. litest_hover_move(dev, 0, 25 + 5 * i, 25 + 5 * i);
  2540. litest_touch_move(dev, 1, 50 + 5 * i, 50 - 5 * i);
  2541. litest_pop_event_frame(dev);
  2542. }
  2543. litest_push_event_frame(dev);
  2544. litest_hover_end(dev, 0);
  2545. litest_touch_up(dev, 1);
  2546. litest_pop_event_frame(dev);
  2547. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2548. }
  2549. END_TEST
  2550. START_TEST(touchpad_hover_1fg_tap)
  2551. {
  2552. struct litest_device *dev = litest_current_device();
  2553. struct libinput *li = dev->libinput;
  2554. litest_enable_tap(dev->libinput_device);
  2555. litest_disable_hold_gestures(dev->libinput_device);
  2556. litest_drain_events(li);
  2557. litest_hover_start(dev, 0, 50, 50);
  2558. litest_hover_end(dev, 0);
  2559. litest_dispatch(li);
  2560. litest_assert_empty_queue(li);
  2561. }
  2562. END_TEST
  2563. static void
  2564. assert_btnevent_from_device(struct litest_device *device,
  2565. unsigned int button,
  2566. enum libinput_button_state state)
  2567. {
  2568. struct libinput *li = device->libinput;
  2569. struct libinput_event *e;
  2570. litest_dispatch(li);
  2571. e = libinput_get_event(li);
  2572. litest_is_button_event(e, button, state);
  2573. litest_assert_ptr_eq(libinput_event_get_device(e), device->libinput_device);
  2574. libinput_event_destroy(e);
  2575. }
  2576. START_TEST(touchpad_trackpoint_buttons)
  2577. {
  2578. struct litest_device *touchpad = litest_current_device();
  2579. struct litest_device *trackpoint;
  2580. struct libinput *li = touchpad->libinput;
  2581. const struct buttons {
  2582. unsigned int device_value;
  2583. unsigned int real_value;
  2584. } buttons[] = {
  2585. { BTN_0, BTN_LEFT },
  2586. { BTN_1, BTN_RIGHT },
  2587. { BTN_2, BTN_MIDDLE },
  2588. };
  2589. trackpoint = litest_add_device(li, LITEST_TRACKPOINT);
  2590. libinput_device_config_scroll_set_method(trackpoint->libinput_device,
  2591. LIBINPUT_CONFIG_SCROLL_NO_SCROLL);
  2592. litest_drain_events(li);
  2593. ARRAY_FOR_EACH(buttons, b) {
  2594. litest_button_click_debounced(touchpad, li, b->device_value, true);
  2595. assert_btnevent_from_device(trackpoint,
  2596. b->real_value,
  2597. LIBINPUT_BUTTON_STATE_PRESSED);
  2598. litest_button_click_debounced(touchpad, li, b->device_value, false);
  2599. assert_btnevent_from_device(trackpoint,
  2600. b->real_value,
  2601. LIBINPUT_BUTTON_STATE_RELEASED);
  2602. }
  2603. litest_device_destroy(trackpoint);
  2604. }
  2605. END_TEST
  2606. START_TEST(touchpad_trackpoint_mb_scroll)
  2607. {
  2608. struct litest_device *touchpad = litest_current_device();
  2609. struct litest_device *trackpoint;
  2610. struct libinput *li = touchpad->libinput;
  2611. trackpoint = litest_add_device(li, LITEST_TRACKPOINT);
  2612. litest_drain_events(li);
  2613. litest_button_click(touchpad, BTN_2, true); /* middle */
  2614. litest_timeout_buttonscroll(li);
  2615. litest_event(trackpoint, EV_REL, REL_Y, -2);
  2616. litest_event(trackpoint, EV_SYN, SYN_REPORT, 0);
  2617. litest_event(trackpoint, EV_REL, REL_Y, -2);
  2618. litest_event(trackpoint, EV_SYN, SYN_REPORT, 0);
  2619. litest_event(trackpoint, EV_REL, REL_Y, -2);
  2620. litest_event(trackpoint, EV_SYN, SYN_REPORT, 0);
  2621. litest_event(trackpoint, EV_REL, REL_Y, -2);
  2622. litest_event(trackpoint, EV_SYN, SYN_REPORT, 0);
  2623. litest_button_click(touchpad, BTN_2, false);
  2624. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_CONTINUOUS);
  2625. litest_device_destroy(trackpoint);
  2626. }
  2627. END_TEST
  2628. START_TEST(touchpad_trackpoint_mb_click)
  2629. {
  2630. struct litest_device *touchpad = litest_current_device();
  2631. struct litest_device *trackpoint;
  2632. struct libinput *li = touchpad->libinput;
  2633. enum libinput_config_status status;
  2634. trackpoint = litest_add_device(li, LITEST_TRACKPOINT);
  2635. status = libinput_device_config_scroll_set_method(
  2636. trackpoint->libinput_device,
  2637. LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN);
  2638. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  2639. litest_drain_events(li);
  2640. litest_button_click_debounced(touchpad, li, BTN_2, true); /* middle */
  2641. litest_button_click_debounced(touchpad, li, BTN_2, false);
  2642. assert_btnevent_from_device(trackpoint,
  2643. BTN_MIDDLE,
  2644. LIBINPUT_BUTTON_STATE_PRESSED);
  2645. assert_btnevent_from_device(trackpoint,
  2646. BTN_MIDDLE,
  2647. LIBINPUT_BUTTON_STATE_RELEASED);
  2648. litest_device_destroy(trackpoint);
  2649. }
  2650. END_TEST
  2651. START_TEST(touchpad_trackpoint_buttons_softbuttons)
  2652. {
  2653. struct litest_device *touchpad = litest_current_device();
  2654. struct litest_device *trackpoint;
  2655. struct libinput *li = touchpad->libinput;
  2656. trackpoint = litest_add_device(li, LITEST_TRACKPOINT);
  2657. litest_drain_events(li);
  2658. litest_touch_down(touchpad, 0, 95, 90);
  2659. litest_button_click_debounced(touchpad, li, BTN_LEFT, true);
  2660. litest_button_click_debounced(touchpad, li, BTN_1, true);
  2661. litest_button_click_debounced(touchpad, li, BTN_LEFT, false);
  2662. litest_touch_up(touchpad, 0);
  2663. litest_button_click_debounced(touchpad, li, BTN_1, false);
  2664. assert_btnevent_from_device(touchpad, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  2665. assert_btnevent_from_device(trackpoint,
  2666. BTN_RIGHT,
  2667. LIBINPUT_BUTTON_STATE_PRESSED);
  2668. assert_btnevent_from_device(touchpad,
  2669. BTN_RIGHT,
  2670. LIBINPUT_BUTTON_STATE_RELEASED);
  2671. assert_btnevent_from_device(trackpoint,
  2672. BTN_RIGHT,
  2673. LIBINPUT_BUTTON_STATE_RELEASED);
  2674. litest_touch_down(touchpad, 0, 95, 90);
  2675. litest_button_click_debounced(touchpad, li, BTN_LEFT, true);
  2676. litest_button_click_debounced(touchpad, li, BTN_1, true);
  2677. litest_button_click_debounced(touchpad, li, BTN_1, false);
  2678. litest_button_click_debounced(touchpad, li, BTN_LEFT, false);
  2679. litest_touch_up(touchpad, 0);
  2680. assert_btnevent_from_device(touchpad, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  2681. assert_btnevent_from_device(trackpoint,
  2682. BTN_RIGHT,
  2683. LIBINPUT_BUTTON_STATE_PRESSED);
  2684. assert_btnevent_from_device(trackpoint,
  2685. BTN_RIGHT,
  2686. LIBINPUT_BUTTON_STATE_RELEASED);
  2687. assert_btnevent_from_device(touchpad,
  2688. BTN_RIGHT,
  2689. LIBINPUT_BUTTON_STATE_RELEASED);
  2690. litest_device_destroy(trackpoint);
  2691. }
  2692. END_TEST
  2693. START_TEST(touchpad_trackpoint_buttons_2fg_scroll)
  2694. {
  2695. struct litest_device *touchpad = litest_current_device();
  2696. struct litest_device *trackpoint;
  2697. struct libinput *li = touchpad->libinput;
  2698. struct libinput_event *e;
  2699. double val;
  2700. trackpoint = litest_add_device(li, LITEST_TRACKPOINT);
  2701. litest_drain_events(li);
  2702. litest_touch_down(touchpad, 0, 40, 70);
  2703. litest_touch_down(touchpad, 1, 60, 70);
  2704. litest_touch_move_two_touches(touchpad, 40, 70, 60, 70, 0, -40, 10);
  2705. litest_dispatch(li);
  2706. litest_wait_for_event(li);
  2707. /* Make sure we get scroll events but _not_ the scroll release */
  2708. while ((e = libinput_get_event(li))) {
  2709. struct libinput_event_pointer *pev;
  2710. pev = litest_is_axis_event(e,
  2711. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  2712. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  2713. 0);
  2714. val = litest_event_pointer_get_value(
  2715. pev,
  2716. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
  2717. litest_assert(val != 0.0);
  2718. libinput_event_destroy(e);
  2719. }
  2720. litest_button_click_debounced(touchpad, li, BTN_1, true);
  2721. assert_btnevent_from_device(trackpoint,
  2722. BTN_RIGHT,
  2723. LIBINPUT_BUTTON_STATE_PRESSED);
  2724. litest_touch_move_to(touchpad, 0, 40, 30, 40, 70, 10);
  2725. litest_touch_move_to(touchpad, 1, 60, 30, 60, 70, 10);
  2726. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  2727. while ((e = libinput_get_event(li))) {
  2728. struct libinput_event_pointer *pev;
  2729. pev = litest_is_axis_event(e,
  2730. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  2731. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  2732. 0);
  2733. val = litest_event_pointer_get_value(
  2734. pev,
  2735. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
  2736. litest_assert(val != 0.0);
  2737. libinput_event_destroy(e);
  2738. }
  2739. litest_button_click_debounced(touchpad, li, BTN_1, false);
  2740. assert_btnevent_from_device(trackpoint,
  2741. BTN_RIGHT,
  2742. LIBINPUT_BUTTON_STATE_RELEASED);
  2743. /* the movement lags behind the touch movement, so the first couple
  2744. events can be downwards even though we started scrolling up. do a
  2745. short scroll up, drain those events, then we can use
  2746. litest_assert_scroll() which tests for the trailing 0/0 scroll
  2747. for us.
  2748. */
  2749. litest_touch_move_to(touchpad, 0, 40, 70, 40, 60, 10);
  2750. litest_touch_move_to(touchpad, 1, 60, 70, 60, 60, 10);
  2751. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  2752. litest_touch_move_to(touchpad, 0, 40, 60, 40, 30, 10);
  2753. litest_touch_move_to(touchpad, 1, 60, 60, 60, 30, 10);
  2754. litest_touch_up(touchpad, 0);
  2755. litest_touch_up(touchpad, 1);
  2756. litest_dispatch(li);
  2757. litest_assert_scroll(li,
  2758. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  2759. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  2760. -1);
  2761. litest_device_destroy(trackpoint);
  2762. }
  2763. END_TEST
  2764. START_TEST(touchpad_trackpoint_no_trackpoint)
  2765. {
  2766. struct litest_device *touchpad = litest_current_device();
  2767. struct libinput *li = touchpad->libinput;
  2768. litest_drain_events(li);
  2769. litest_button_click(touchpad, BTN_0, true); /* left */
  2770. litest_button_click(touchpad, BTN_0, false);
  2771. litest_assert_empty_queue(li);
  2772. litest_button_click(touchpad, BTN_1, true); /* right */
  2773. litest_button_click(touchpad, BTN_1, false);
  2774. litest_assert_empty_queue(li);
  2775. litest_button_click(touchpad, BTN_2, true); /* middle */
  2776. litest_button_click(touchpad, BTN_2, false);
  2777. litest_assert_empty_queue(li);
  2778. }
  2779. END_TEST
  2780. START_TEST(touchpad_initial_state)
  2781. {
  2782. struct litest_device *dev;
  2783. struct libinput *libinput1;
  2784. int x = 40, y = 60;
  2785. int axis = litest_test_param_get_i32(test_env->params, "axis");
  2786. dev = litest_current_device();
  2787. libinput1 = dev->libinput;
  2788. litest_disable_tap(dev->libinput_device);
  2789. litest_disable_hold_gestures(dev->libinput_device);
  2790. litest_touch_down(dev, 0, x, y);
  2791. litest_touch_up(dev, 0);
  2792. /* device is now on some x/y value */
  2793. litest_drain_events(libinput1);
  2794. _litest_context_destroy_ struct libinput *libinput2 = litest_create_context();
  2795. libinput_path_add_device(libinput2, libevdev_uinput_get_devnode(dev->uinput));
  2796. litest_drain_events(libinput2);
  2797. if (axis == ABS_X)
  2798. x = 30;
  2799. else
  2800. y = 30;
  2801. litest_touch_down(dev, 0, x, y);
  2802. litest_dispatch(libinput1);
  2803. litest_dispatch(libinput2);
  2804. litest_touch_move_to(dev, 0, x, y, 70, 70, 10);
  2805. litest_dispatch(libinput1);
  2806. litest_dispatch(libinput2);
  2807. litest_touch_up(dev, 0);
  2808. litest_dispatch(libinput1);
  2809. litest_dispatch(libinput2);
  2810. litest_wait_for_event(libinput1);
  2811. litest_wait_for_event(libinput2);
  2812. while (libinput_next_event_type(libinput1)) {
  2813. struct libinput_event *ev1, *ev2;
  2814. struct libinput_event_pointer *p1, *p2;
  2815. ev1 = libinput_get_event(libinput1);
  2816. ev2 = libinput_get_event(libinput2);
  2817. p1 = litest_is_motion_event(ev1);
  2818. p2 = litest_is_motion_event(ev2);
  2819. litest_assert_int_eq(libinput_event_get_type(ev1),
  2820. libinput_event_get_type(ev2));
  2821. litest_assert_double_eq(libinput_event_pointer_get_dx(p1),
  2822. libinput_event_pointer_get_dx(p2));
  2823. litest_assert_double_eq(libinput_event_pointer_get_dy(p1),
  2824. libinput_event_pointer_get_dy(p2));
  2825. libinput_event_destroy(ev1);
  2826. libinput_event_destroy(ev2);
  2827. }
  2828. }
  2829. END_TEST
  2830. START_TEST(touchpad_fingers_down_before_init)
  2831. {
  2832. struct litest_device *dev = litest_current_device();
  2833. int finger_count = litest_test_param_get_i32(test_env->params, "fingers");
  2834. unsigned int map[] = { 0,
  2835. BTN_TOOL_PEN,
  2836. BTN_TOOL_DOUBLETAP,
  2837. BTN_TOOL_TRIPLETAP,
  2838. BTN_TOOL_QUADTAP,
  2839. BTN_TOOL_QUINTTAP };
  2840. if (!libevdev_has_event_code(dev->evdev, EV_KEY, map[finger_count]))
  2841. return LITEST_NOT_APPLICABLE;
  2842. /* Fingers down but before we have the real context */
  2843. for (int i = 0; i < finger_count; i++) {
  2844. if (litest_slot_count(dev) >= finger_count) {
  2845. litest_touch_down(dev, i, 20 + 10 * i, 30);
  2846. } else {
  2847. litest_event(dev, EV_KEY, map[finger_count], 1);
  2848. }
  2849. }
  2850. litest_drain_events(dev->libinput);
  2851. /* create anew context that already has the fingers down */
  2852. _litest_context_destroy_ struct libinput *li = litest_create_context();
  2853. libinput_path_add_device(li, libevdev_uinput_get_devnode(dev->uinput));
  2854. litest_drain_events(li);
  2855. for (int x = 0; x < 10; x++) {
  2856. for (int i = 0; i < finger_count; i++) {
  2857. if (litest_slot_count(dev) < finger_count)
  2858. break;
  2859. litest_touch_move(dev, i, 20 + 10 * i + x, 30);
  2860. litest_dispatch(li);
  2861. }
  2862. litest_dispatch(li);
  2863. }
  2864. litest_dispatch(li);
  2865. litest_assert_empty_queue(li);
  2866. for (int i = 0; i < finger_count; i++) {
  2867. if (litest_slot_count(dev) >= finger_count) {
  2868. litest_touch_up(dev, i);
  2869. } else {
  2870. litest_event(dev, EV_KEY, map[finger_count], 0);
  2871. }
  2872. litest_dispatch(li);
  2873. }
  2874. litest_assert_empty_queue(li);
  2875. }
  2876. END_TEST
  2877. /* This just tests that we don't completely screw up in one specific case.
  2878. * The test likely needs to be removed if it starts failing in the future.
  2879. *
  2880. * Where we get touch releases during SYN_DROPPED, libevdev < 1.9.0 gives us
  2881. * wrong event sequence during sync, see
  2882. * https://gitlab.freedesktop.org/libevdev/libevdev/merge_requests/19
  2883. *
  2884. * libinput 1.15.1 ended up dropping our slot count to 0, making the
  2885. * touchpad unusable, see #422. This test just checks that we can still move
  2886. * the pointer and scroll where we trigger such a sequence. This tests for
  2887. * the worst-case scenario - where we previously reset to a slot count of 0.
  2888. *
  2889. * However, the exact behavior depends on how many slots were
  2890. * stopped/restarted during SYN_DROPPED, a single test is barely useful.
  2891. * libinput will still do the wrong thing if you start with e.g. 3fg on the
  2892. * touchpad and release one or two of them. But since this needs to be fixed
  2893. * in libevdev, here is the most important test.
  2894. */
  2895. START_TEST(touchpad_state_after_syn_dropped_2fg_change)
  2896. {
  2897. struct litest_device *dev = litest_current_device();
  2898. struct libinput *li = dev->libinput;
  2899. litest_drain_events(li);
  2900. litest_disable_tap(dev->libinput_device);
  2901. litest_disable_hold_gestures(dev->libinput_device);
  2902. litest_touch_down(dev, 0, 10, 10);
  2903. litest_dispatch(li);
  2904. /* Force a SYN_DROPPED */
  2905. for (int i = 0; i < 500; i++)
  2906. litest_touch_move(dev, 0, 10 + 0.1 * i, 10 + 0.1 * i);
  2907. /* still within SYN_DROPPED */
  2908. litest_touch_up(dev, 0);
  2909. litest_touch_down(dev, 0, 50, 50);
  2910. litest_touch_down(dev, 1, 70, 50);
  2911. litest_dispatch(li);
  2912. litest_drain_events(li);
  2913. litest_touch_up(dev, 0);
  2914. litest_touch_up(dev, 1);
  2915. /* 2fg scrolling still works? */
  2916. litest_touch_down(dev, 0, 50, 50);
  2917. litest_touch_down(dev, 1, 70, 50);
  2918. litest_touch_move_two_touches(dev, 50, 50, 70, 50, 0, -20, 10);
  2919. litest_touch_up(dev, 0);
  2920. litest_touch_up(dev, 1);
  2921. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  2922. /* pointer motion still works? */
  2923. litest_touch_down(dev, 0, 50, 50);
  2924. for (int i = 0; i < 10; i++)
  2925. litest_touch_move(dev, 0, 10 + 0.1 * i, 10 + 0.1 * i);
  2926. litest_touch_up(dev, 0);
  2927. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2928. }
  2929. END_TEST
  2930. START_TEST(touchpad_dwt_single_key)
  2931. {
  2932. struct litest_device *touchpad = litest_current_device();
  2933. struct litest_device *keyboard;
  2934. struct libinput *li = touchpad->libinput;
  2935. if (!has_disable_while_typing(touchpad))
  2936. return LITEST_NOT_APPLICABLE;
  2937. keyboard = dwt_init_paired_keyboard(li, touchpad);
  2938. litest_disable_tap(touchpad->libinput_device);
  2939. litest_disable_hold_gestures(touchpad->libinput_device);
  2940. litest_drain_events(li);
  2941. litest_keyboard_key(keyboard, KEY_A, true);
  2942. litest_keyboard_key(keyboard, KEY_A, false);
  2943. litest_dispatch(li);
  2944. litest_touch_down(touchpad, 0, 50, 50);
  2945. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  2946. litest_touch_up(touchpad, 0);
  2947. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  2948. litest_timeout_dwt_long(li);
  2949. /* after timeout - motion events*/
  2950. litest_touch_down(touchpad, 0, 50, 50);
  2951. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  2952. litest_touch_up(touchpad, 0);
  2953. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2954. litest_device_destroy(keyboard);
  2955. }
  2956. END_TEST
  2957. START_TEST(touchpad_dwt_ext_and_int_keyboard)
  2958. {
  2959. struct litest_device *touchpad = litest_current_device();
  2960. struct litest_device *keyboard, *yubikey;
  2961. struct libinput *li = touchpad->libinput;
  2962. if (!has_disable_while_typing(touchpad))
  2963. return LITEST_NOT_APPLICABLE;
  2964. litest_disable_tap(touchpad->libinput_device);
  2965. litest_disable_hold_gestures(touchpad->libinput_device);
  2966. /* Yubikey is initialized first */
  2967. yubikey = litest_add_device(li, LITEST_YUBIKEY);
  2968. litest_drain_events(li);
  2969. keyboard = dwt_init_paired_keyboard(li, touchpad);
  2970. litest_drain_events(li);
  2971. litest_keyboard_key(keyboard, KEY_A, true);
  2972. litest_keyboard_key(keyboard, KEY_A, false);
  2973. litest_dispatch(li);
  2974. litest_touch_down(touchpad, 0, 50, 50);
  2975. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  2976. litest_touch_up(touchpad, 0);
  2977. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  2978. litest_timeout_dwt_short(li);
  2979. /* after timeout - motion events*/
  2980. litest_touch_down(touchpad, 0, 50, 50);
  2981. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  2982. litest_touch_up(touchpad, 0);
  2983. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  2984. litest_device_destroy(keyboard);
  2985. litest_device_destroy(yubikey);
  2986. }
  2987. END_TEST
  2988. START_TEST(touchpad_dwt_enable_touch)
  2989. {
  2990. struct litest_device *touchpad = litest_current_device();
  2991. struct litest_device *keyboard;
  2992. struct libinput *li = touchpad->libinput;
  2993. if (!has_disable_while_typing(touchpad))
  2994. return LITEST_NOT_APPLICABLE;
  2995. keyboard = dwt_init_paired_keyboard(li, touchpad);
  2996. litest_disable_tap(touchpad->libinput_device);
  2997. litest_disable_hold_gestures(touchpad->libinput_device);
  2998. litest_drain_events(li);
  2999. litest_keyboard_key(keyboard, KEY_A, true);
  3000. litest_keyboard_key(keyboard, KEY_A, false);
  3001. litest_dispatch(li);
  3002. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3003. /* finger down after last key event, but
  3004. we're still within timeout - no events */
  3005. msleep(10);
  3006. litest_touch_down(touchpad, 0, 50, 50);
  3007. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  3008. litest_assert_empty_queue(li);
  3009. litest_timeout_dwt_short(li);
  3010. /* same touch after timeout - motion events*/
  3011. litest_touch_move_to(touchpad, 0, 70, 50, 50, 50, 10);
  3012. litest_touch_up(touchpad, 0);
  3013. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3014. litest_device_destroy(keyboard);
  3015. }
  3016. END_TEST
  3017. START_TEST(touchpad_dwt_touch_hold)
  3018. {
  3019. struct litest_device *touchpad = litest_current_device();
  3020. struct litest_device *keyboard;
  3021. struct libinput *li = touchpad->libinput;
  3022. if (!has_disable_while_typing(touchpad))
  3023. return LITEST_NOT_APPLICABLE;
  3024. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3025. litest_disable_tap(touchpad->libinput_device);
  3026. litest_disable_hold_gestures(touchpad->libinput_device);
  3027. litest_drain_events(li);
  3028. litest_keyboard_key(keyboard, KEY_A, true);
  3029. msleep(1); /* make sure touch starts after key press */
  3030. litest_touch_down(touchpad, 0, 50, 50);
  3031. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3032. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3033. /* touch still down - no events */
  3034. litest_keyboard_key(keyboard, KEY_A, false);
  3035. litest_dispatch(li);
  3036. litest_touch_move_to(touchpad, 0, 70, 50, 30, 50, 5);
  3037. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3038. /* touch still down - no events */
  3039. litest_timeout_dwt_short(li);
  3040. litest_touch_move_to(touchpad, 0, 30, 50, 50, 50, 5);
  3041. litest_touch_up(touchpad, 0);
  3042. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3043. litest_device_destroy(keyboard);
  3044. }
  3045. END_TEST
  3046. START_TEST(touchpad_dwt_key_hold)
  3047. {
  3048. struct litest_device *touchpad = litest_current_device();
  3049. struct litest_device *keyboard;
  3050. struct libinput *li = touchpad->libinput;
  3051. if (!has_disable_while_typing(touchpad))
  3052. return LITEST_NOT_APPLICABLE;
  3053. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3054. litest_disable_tap(touchpad->libinput_device);
  3055. litest_disable_hold_gestures(touchpad->libinput_device);
  3056. litest_drain_events(li);
  3057. litest_keyboard_key(keyboard, KEY_A, true);
  3058. litest_dispatch(li);
  3059. litest_touch_down(touchpad, 0, 50, 50);
  3060. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3061. litest_touch_up(touchpad, 0);
  3062. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3063. litest_keyboard_key(keyboard, KEY_A, false);
  3064. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3065. litest_device_destroy(keyboard);
  3066. }
  3067. END_TEST
  3068. START_TEST(touchpad_dwt_key_hold_timeout)
  3069. {
  3070. struct litest_device *touchpad = litest_current_device();
  3071. struct litest_device *keyboard;
  3072. struct libinput *li = touchpad->libinput;
  3073. if (!has_disable_while_typing(touchpad))
  3074. return LITEST_NOT_APPLICABLE;
  3075. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3076. litest_disable_tap(touchpad->libinput_device);
  3077. litest_disable_hold_gestures(touchpad->libinput_device);
  3078. litest_drain_events(li);
  3079. litest_keyboard_key(keyboard, KEY_A, true);
  3080. litest_dispatch(li);
  3081. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3082. litest_timeout_dwt_long(li);
  3083. litest_touch_down(touchpad, 0, 50, 50);
  3084. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3085. litest_touch_up(touchpad, 0);
  3086. litest_assert_empty_queue(li);
  3087. litest_keyboard_key(keyboard, KEY_A, false);
  3088. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3089. /* key is up, but still within timeout */
  3090. litest_touch_down(touchpad, 0, 50, 50);
  3091. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3092. litest_touch_up(touchpad, 0);
  3093. litest_assert_empty_queue(li);
  3094. /* expire timeout */
  3095. litest_timeout_dwt_long(li);
  3096. litest_touch_down(touchpad, 0, 50, 50);
  3097. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3098. litest_touch_up(touchpad, 0);
  3099. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3100. litest_device_destroy(keyboard);
  3101. }
  3102. END_TEST
  3103. START_TEST(touchpad_dwt_key_hold_timeout_existing_touch_cornercase)
  3104. {
  3105. struct litest_device *touchpad = litest_current_device();
  3106. struct litest_device *keyboard;
  3107. struct libinput *li = touchpad->libinput;
  3108. if (!has_disable_while_typing(touchpad))
  3109. return LITEST_NOT_APPLICABLE;
  3110. /* Note: this tests for the current behavior of a cornercase, and
  3111. * the behaviour is essentially a bug. If this test fails it may be
  3112. * because the buggy behavior was fixed.
  3113. */
  3114. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3115. litest_disable_tap(touchpad->libinput_device);
  3116. litest_disable_hold_gestures(touchpad->libinput_device);
  3117. litest_drain_events(li);
  3118. litest_keyboard_key(keyboard, KEY_A, true);
  3119. litest_dispatch(li);
  3120. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3121. litest_timeout_dwt_long(li);
  3122. /* Touch starting after re-issuing the dwt timeout */
  3123. litest_touch_down(touchpad, 0, 50, 50);
  3124. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3125. litest_assert_empty_queue(li);
  3126. litest_keyboard_key(keyboard, KEY_A, false);
  3127. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3128. /* key is up, but still within timeout */
  3129. litest_touch_move_to(touchpad, 0, 70, 50, 50, 50, 5);
  3130. litest_assert_empty_queue(li);
  3131. /* Expire dwt timeout. Because the touch started after re-issuing
  3132. * the last timeout, it looks like the touch started after the last
  3133. * key press. Such touches are enabled for pointer motion by
  3134. * libinput when dwt expires.
  3135. * This is buggy behavior and not what a user would typically
  3136. * expect. But it's hard to trigger in real life too.
  3137. */
  3138. litest_timeout_dwt_long(li);
  3139. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3140. litest_touch_up(touchpad, 0);
  3141. /* If the below check for motion event fails because no events are
  3142. * in the pipe, the buggy behavior was fixed and this test case
  3143. * can be removed */
  3144. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3145. litest_device_destroy(keyboard);
  3146. }
  3147. END_TEST
  3148. START_TEST(touchpad_dwt_key_hold_timeout_existing_touch)
  3149. {
  3150. struct litest_device *touchpad = litest_current_device();
  3151. struct litest_device *keyboard;
  3152. struct libinput *li = touchpad->libinput;
  3153. if (!has_disable_while_typing(touchpad))
  3154. return LITEST_NOT_APPLICABLE;
  3155. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3156. litest_disable_tap(touchpad->libinput_device);
  3157. litest_disable_hold_gestures(touchpad->libinput_device);
  3158. litest_drain_events(li);
  3159. litest_keyboard_key(keyboard, KEY_A, true);
  3160. litest_dispatch(li);
  3161. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3162. litest_touch_down(touchpad, 0, 50, 50);
  3163. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3164. litest_timeout_dwt_long(li);
  3165. litest_assert_empty_queue(li);
  3166. litest_keyboard_key(keyboard, KEY_A, false);
  3167. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3168. /* key is up, but still within timeout */
  3169. litest_touch_move_to(touchpad, 0, 70, 50, 50, 50, 5);
  3170. litest_assert_empty_queue(li);
  3171. /* expire timeout, but touch started before release */
  3172. litest_timeout_dwt_long(li);
  3173. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3174. litest_touch_up(touchpad, 0);
  3175. litest_assert_empty_queue(li);
  3176. litest_device_destroy(keyboard);
  3177. }
  3178. END_TEST
  3179. START_TEST(touchpad_dwt_type)
  3180. {
  3181. struct litest_device *touchpad = litest_current_device();
  3182. struct litest_device *keyboard;
  3183. struct libinput *li = touchpad->libinput;
  3184. int i;
  3185. uint32_t timeout = litest_test_param_get_u32(test_env->params, "timeout");
  3186. if (!has_disable_while_typing(touchpad))
  3187. return LITEST_NOT_APPLICABLE;
  3188. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3189. litest_disable_tap(touchpad->libinput_device);
  3190. litest_disable_hold_gestures(touchpad->libinput_device);
  3191. litest_drain_events(li);
  3192. if (timeout) {
  3193. auto status = libinput_device_config_dwt_set_timeout(
  3194. touchpad->libinput_device,
  3195. timeout);
  3196. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  3197. }
  3198. for (i = 0; i < 5; i++) {
  3199. litest_keyboard_key(keyboard, KEY_A, true);
  3200. litest_keyboard_key(keyboard, KEY_A, false);
  3201. litest_dispatch(li);
  3202. }
  3203. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3204. litest_touch_down(touchpad, 0, 50, 50);
  3205. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3206. litest_touch_up(touchpad, 0);
  3207. litest_assert_empty_queue(li);
  3208. if (timeout) {
  3209. litest_timeout(li, timeout);
  3210. } else {
  3211. litest_timeout_dwt_long(li);
  3212. }
  3213. litest_touch_down(touchpad, 0, 50, 50);
  3214. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3215. litest_touch_up(touchpad, 0);
  3216. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3217. litest_device_destroy(keyboard);
  3218. }
  3219. END_TEST
  3220. START_TEST(touchpad_dwt_type_short_timeout)
  3221. {
  3222. struct litest_device *touchpad = litest_current_device();
  3223. struct litest_device *keyboard;
  3224. struct libinput *li = touchpad->libinput;
  3225. int i;
  3226. if (!has_disable_while_typing(touchpad))
  3227. return LITEST_NOT_APPLICABLE;
  3228. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3229. litest_disable_tap(touchpad->libinput_device);
  3230. litest_disable_hold_gestures(touchpad->libinput_device);
  3231. litest_drain_events(li);
  3232. for (i = 0; i < 5; i++) {
  3233. litest_keyboard_key(keyboard, KEY_A, true);
  3234. litest_keyboard_key(keyboard, KEY_A, false);
  3235. litest_dispatch(li);
  3236. }
  3237. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3238. litest_touch_down(touchpad, 0, 50, 50);
  3239. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3240. litest_touch_up(touchpad, 0);
  3241. litest_assert_empty_queue(li);
  3242. litest_timeout_dwt_short(li);
  3243. litest_touch_down(touchpad, 0, 50, 50);
  3244. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3245. litest_touch_up(touchpad, 0);
  3246. litest_assert_empty_queue(li);
  3247. litest_device_destroy(keyboard);
  3248. }
  3249. END_TEST
  3250. START_TEST(touchpad_dwt_modifier_no_dwt)
  3251. {
  3252. struct litest_device *touchpad = litest_current_device();
  3253. struct litest_device *keyboard;
  3254. struct libinput *li = touchpad->libinput;
  3255. unsigned int modifiers[] = {
  3256. KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTALT, KEY_RIGHTALT,
  3257. KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_FN, KEY_CAPSLOCK,
  3258. KEY_TAB, KEY_COMPOSE, KEY_RIGHTMETA, KEY_LEFTMETA,
  3259. KEY_ESC, KEY_KPASTERISK, KEY_F1,
  3260. };
  3261. if (!has_disable_while_typing(touchpad))
  3262. return LITEST_NOT_APPLICABLE;
  3263. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3264. litest_disable_tap(touchpad->libinput_device);
  3265. litest_disable_hold_gestures(touchpad->libinput_device);
  3266. litest_drain_events(li);
  3267. ARRAY_FOR_EACH(modifiers, key) {
  3268. litest_keyboard_key(keyboard, *key, true);
  3269. litest_keyboard_key(keyboard, *key, false);
  3270. litest_dispatch(li);
  3271. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3272. litest_touch_down(touchpad, 0, 50, 50);
  3273. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3274. litest_touch_up(touchpad, 0);
  3275. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3276. }
  3277. litest_device_destroy(keyboard);
  3278. }
  3279. END_TEST
  3280. START_TEST(touchpad_dwt_shift_combo_triggers_dwt)
  3281. {
  3282. struct litest_device *touchpad = litest_current_device();
  3283. struct litest_device *keyboard;
  3284. struct libinput *li = touchpad->libinput;
  3285. unsigned int modifiers[] = {
  3286. KEY_LEFTSHIFT,
  3287. KEY_RIGHTSHIFT,
  3288. };
  3289. if (!has_disable_while_typing(touchpad))
  3290. return LITEST_NOT_APPLICABLE;
  3291. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3292. litest_disable_tap(touchpad->libinput_device);
  3293. litest_disable_hold_gestures(touchpad->libinput_device);
  3294. litest_drain_events(li);
  3295. ARRAY_FOR_EACH(modifiers, key) {
  3296. litest_keyboard_key(keyboard, *key, true);
  3297. litest_keyboard_key(keyboard, KEY_A, true);
  3298. litest_keyboard_key(keyboard, KEY_A, false);
  3299. litest_keyboard_key(keyboard, *key, false);
  3300. litest_dispatch(li);
  3301. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3302. litest_touch_down(touchpad, 0, 50, 50);
  3303. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3304. litest_touch_up(touchpad, 0);
  3305. litest_assert_empty_queue(li);
  3306. }
  3307. litest_timeout_dwt_long(li);
  3308. litest_touch_down(touchpad, 0, 50, 50);
  3309. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3310. litest_touch_up(touchpad, 0);
  3311. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3312. litest_device_destroy(keyboard);
  3313. }
  3314. END_TEST
  3315. START_TEST(touchpad_dwt_modifier_combo_no_dwt)
  3316. {
  3317. struct litest_device *touchpad = litest_current_device();
  3318. struct litest_device *keyboard;
  3319. struct libinput *li = touchpad->libinput;
  3320. unsigned int modifiers[] = {
  3321. KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTALT, KEY_RIGHTALT, KEY_FN,
  3322. KEY_CAPSLOCK, KEY_TAB, KEY_COMPOSE, KEY_RIGHTMETA, KEY_LEFTMETA,
  3323. };
  3324. if (!has_disable_while_typing(touchpad))
  3325. return LITEST_NOT_APPLICABLE;
  3326. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3327. litest_disable_tap(touchpad->libinput_device);
  3328. litest_disable_hold_gestures(touchpad->libinput_device);
  3329. litest_drain_events(li);
  3330. ARRAY_FOR_EACH(modifiers, key) {
  3331. litest_keyboard_key(keyboard, *key, true);
  3332. litest_keyboard_key(keyboard, KEY_A, true);
  3333. litest_keyboard_key(keyboard, KEY_A, false);
  3334. litest_keyboard_key(keyboard, KEY_B, true);
  3335. litest_keyboard_key(keyboard, KEY_B, false);
  3336. litest_keyboard_key(keyboard, *key, false);
  3337. litest_dispatch(li);
  3338. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3339. litest_touch_down(touchpad, 0, 50, 50);
  3340. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3341. litest_touch_up(touchpad, 0);
  3342. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3343. }
  3344. litest_device_destroy(keyboard);
  3345. }
  3346. END_TEST
  3347. START_TEST(touchpad_dwt_modifier_combo_dwt_after)
  3348. {
  3349. struct litest_device *touchpad = litest_current_device();
  3350. struct litest_device *keyboard;
  3351. struct libinput *li = touchpad->libinput;
  3352. unsigned int modifiers[] = {
  3353. KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTALT, KEY_RIGHTALT, KEY_FN,
  3354. KEY_CAPSLOCK, KEY_TAB, KEY_COMPOSE, KEY_RIGHTMETA, KEY_LEFTMETA,
  3355. };
  3356. if (!has_disable_while_typing(touchpad))
  3357. return LITEST_NOT_APPLICABLE;
  3358. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3359. litest_disable_tap(touchpad->libinput_device);
  3360. litest_disable_hold_gestures(touchpad->libinput_device);
  3361. litest_drain_events(li);
  3362. ARRAY_FOR_EACH(modifiers, key) {
  3363. litest_keyboard_key(keyboard, *key, true);
  3364. litest_keyboard_key(keyboard, KEY_A, true);
  3365. litest_keyboard_key(keyboard, KEY_A, false);
  3366. litest_keyboard_key(keyboard, *key, false);
  3367. litest_dispatch(li);
  3368. litest_keyboard_key(keyboard, KEY_A, true);
  3369. litest_keyboard_key(keyboard, KEY_A, false);
  3370. litest_dispatch(li);
  3371. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3372. litest_touch_down(touchpad, 0, 50, 50);
  3373. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3374. litest_touch_up(touchpad, 0);
  3375. litest_assert_empty_queue(li);
  3376. litest_timeout_dwt_long(li);
  3377. }
  3378. litest_device_destroy(keyboard);
  3379. }
  3380. END_TEST
  3381. START_TEST(touchpad_dwt_modifier_combo_dwt_remains)
  3382. {
  3383. struct litest_device *touchpad = litest_current_device();
  3384. struct litest_device *keyboard;
  3385. struct libinput *li = touchpad->libinput;
  3386. unsigned int modifiers[] = {
  3387. KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTALT, KEY_RIGHTALT, KEY_FN,
  3388. KEY_CAPSLOCK, KEY_TAB, KEY_COMPOSE, KEY_RIGHTMETA, KEY_LEFTMETA,
  3389. };
  3390. if (!has_disable_while_typing(touchpad))
  3391. return LITEST_NOT_APPLICABLE;
  3392. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3393. litest_disable_tap(touchpad->libinput_device);
  3394. litest_disable_hold_gestures(touchpad->libinput_device);
  3395. litest_drain_events(li);
  3396. ARRAY_FOR_EACH(modifiers, key) {
  3397. litest_keyboard_key(keyboard, KEY_A, true);
  3398. litest_keyboard_key(keyboard, KEY_A, false);
  3399. litest_dispatch(li);
  3400. /* this can't really be tested directly. The above key
  3401. * should enable dwt, the next key continues and extends the
  3402. * timeout as usual (despite the modifier combo). but
  3403. * testing for timeout differences is fickle, so all we can
  3404. * test though is that dwt is still on after the modifier
  3405. * combo and does not get disabled immediately.
  3406. */
  3407. litest_keyboard_key(keyboard, *key, true);
  3408. litest_keyboard_key(keyboard, KEY_A, true);
  3409. litest_keyboard_key(keyboard, KEY_A, false);
  3410. litest_keyboard_key(keyboard, *key, false);
  3411. litest_dispatch(li);
  3412. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3413. litest_touch_down(touchpad, 0, 50, 50);
  3414. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3415. litest_touch_up(touchpad, 0);
  3416. litest_assert_empty_queue(li);
  3417. litest_timeout_dwt_long(li);
  3418. }
  3419. litest_device_destroy(keyboard);
  3420. }
  3421. END_TEST
  3422. START_TEST(touchpad_dwt_fkeys_no_dwt)
  3423. {
  3424. struct litest_device *touchpad = litest_current_device();
  3425. struct litest_device *keyboard;
  3426. struct libinput *li = touchpad->libinput;
  3427. unsigned int key;
  3428. if (!has_disable_while_typing(touchpad))
  3429. return LITEST_NOT_APPLICABLE;
  3430. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3431. litest_disable_tap(touchpad->libinput_device);
  3432. litest_disable_hold_gestures(touchpad->libinput_device);
  3433. litest_drain_events(li);
  3434. for (key = KEY_F1; key < KEY_CNT; key++) {
  3435. if (!libinput_device_keyboard_has_key(keyboard->libinput_device, key))
  3436. continue;
  3437. litest_keyboard_key(keyboard, key, true);
  3438. litest_keyboard_key(keyboard, key, false);
  3439. litest_dispatch(li);
  3440. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3441. litest_touch_down(touchpad, 0, 50, 50);
  3442. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3443. litest_touch_up(touchpad, 0);
  3444. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3445. }
  3446. litest_device_destroy(keyboard);
  3447. }
  3448. END_TEST
  3449. START_TEST(touchpad_dwt_tap)
  3450. {
  3451. struct litest_device *touchpad = litest_current_device();
  3452. struct litest_device *keyboard;
  3453. struct libinput *li = touchpad->libinput;
  3454. if (!has_disable_while_typing(touchpad))
  3455. return LITEST_NOT_APPLICABLE;
  3456. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3457. litest_enable_tap(touchpad->libinput_device);
  3458. litest_disable_hold_gestures(touchpad->libinput_device);
  3459. litest_drain_events(li);
  3460. litest_keyboard_key(keyboard, KEY_A, true);
  3461. litest_dispatch(li);
  3462. litest_touch_down(touchpad, 0, 50, 50);
  3463. litest_touch_up(touchpad, 0);
  3464. litest_keyboard_key(keyboard, KEY_A, false);
  3465. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3466. litest_timeout_dwt_short(li);
  3467. litest_touch_down(touchpad, 0, 50, 50);
  3468. litest_touch_up(touchpad, 0);
  3469. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  3470. litest_device_destroy(keyboard);
  3471. }
  3472. END_TEST
  3473. START_TEST(touchpad_dwt_tap_drag)
  3474. {
  3475. struct litest_device *touchpad = litest_current_device();
  3476. struct litest_device *keyboard;
  3477. struct libinput *li = touchpad->libinput;
  3478. if (!has_disable_while_typing(touchpad))
  3479. return LITEST_NOT_APPLICABLE;
  3480. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3481. litest_enable_tap(touchpad->libinput_device);
  3482. litest_disable_hold_gestures(touchpad->libinput_device);
  3483. litest_drain_events(li);
  3484. litest_keyboard_key(keyboard, KEY_A, true);
  3485. litest_dispatch(li);
  3486. msleep(1); /* make sure touch starts after key press */
  3487. litest_touch_down(touchpad, 0, 50, 50);
  3488. litest_touch_up(touchpad, 0);
  3489. litest_touch_down(touchpad, 0, 50, 50);
  3490. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 5);
  3491. litest_keyboard_key(keyboard, KEY_A, false);
  3492. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3493. litest_timeout_dwt_short(li);
  3494. litest_touch_move_to(touchpad, 0, 70, 50, 50, 50, 5);
  3495. litest_touch_up(touchpad, 0);
  3496. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3497. litest_device_destroy(keyboard);
  3498. }
  3499. END_TEST
  3500. START_TEST(touchpad_dwt_click)
  3501. {
  3502. struct litest_device *touchpad = litest_current_device();
  3503. struct litest_device *keyboard;
  3504. struct libinput *li = touchpad->libinput;
  3505. if (!has_disable_while_typing(touchpad))
  3506. return LITEST_NOT_APPLICABLE;
  3507. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3508. litest_disable_tap(touchpad->libinput_device);
  3509. litest_disable_hold_gestures(touchpad->libinput_device);
  3510. litest_drain_events(li);
  3511. litest_keyboard_key(keyboard, KEY_A, true);
  3512. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3513. litest_touch_down(touchpad, 0, 50, 50);
  3514. litest_button_click(touchpad, BTN_LEFT, true);
  3515. litest_button_click(touchpad, BTN_LEFT, false);
  3516. litest_dispatch(li);
  3517. litest_touch_up(touchpad, 0);
  3518. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  3519. litest_keyboard_key(keyboard, KEY_A, false);
  3520. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3521. litest_device_destroy(keyboard);
  3522. }
  3523. END_TEST
  3524. START_TEST(touchpad_dwt_edge_scroll)
  3525. {
  3526. struct litest_device *touchpad = litest_current_device();
  3527. struct litest_device *keyboard;
  3528. struct libinput *li = touchpad->libinput;
  3529. if (!has_disable_while_typing(touchpad))
  3530. return LITEST_NOT_APPLICABLE;
  3531. litest_enable_edge_scroll(touchpad);
  3532. keyboard = dwt_init_paired_keyboard(li, touchpad);
  3533. litest_drain_events(li);
  3534. litest_keyboard_key(keyboard, KEY_A, true);
  3535. litest_keyboard_key(keyboard, KEY_A, false);
  3536. litest_keyboard_key(keyboard, KEY_A, true);
  3537. litest_keyboard_key(keyboard, KEY_A, false);
  3538. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3539. litest_touch_down(touchpad, 0, 99, 20);
  3540. litest_timeout_edgescroll(li);
  3541. litest_assert_empty_queue(li);
  3542. /* edge scroll timeout is 300ms atm, make sure we don't accidentally
  3543. exit the DWT timeout */
  3544. litest_keyboard_key(keyboard, KEY_A, true);
  3545. litest_keyboard_key(keyboard, KEY_A, false);
  3546. litest_dispatch(li);
  3547. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3548. litest_touch_move_to(touchpad, 0, 99, 20, 99, 80, 60);
  3549. litest_dispatch(li);
  3550. litest_assert_empty_queue(li);
  3551. litest_touch_move_to(touchpad, 0, 99, 80, 99, 20, 60);
  3552. litest_touch_up(touchpad, 0);
  3553. litest_dispatch(li);
  3554. litest_assert_empty_queue(li);
  3555. litest_device_destroy(keyboard);
  3556. }
  3557. END_TEST
  3558. START_TEST(touchpad_dwt_dont_interrupt_edge_scroll)
  3559. {
  3560. struct litest_device *touchpad = litest_current_device();
  3561. struct libinput *li = touchpad->libinput;
  3562. if (!has_disable_while_typing(touchpad))
  3563. return LITEST_NOT_APPLICABLE;
  3564. litest_enable_edge_scroll(touchpad);
  3565. _destroy_(litest_device) *keyboard = dwt_init_paired_keyboard(li, touchpad);
  3566. litest_drain_events(li);
  3567. litest_log_group("Start edge scroll") {
  3568. litest_touch_down(touchpad, 0, 99, 20);
  3569. litest_timeout_edgescroll(li);
  3570. litest_touch_move_to(touchpad, 0, 99, 20, 99, 30, 10);
  3571. litest_dispatch(li);
  3572. litest_assert_only_axis_events(li,
  3573. LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  3574. }
  3575. litest_log_group("Trigger key events") {
  3576. litest_keyboard_key(keyboard, KEY_A, true);
  3577. litest_keyboard_key(keyboard, KEY_A, false);
  3578. litest_dispatch(li);
  3579. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
  3580. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
  3581. litest_keyboard_key(keyboard, KEY_B, true);
  3582. litest_keyboard_key(keyboard, KEY_B, false);
  3583. litest_dispatch(li);
  3584. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_PRESSED);
  3585. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_RELEASED);
  3586. }
  3587. litest_log_group("Continue scrolling") {
  3588. litest_touch_move_to(touchpad, 0, 99, 30, 99, 50, 10);
  3589. litest_dispatch(li);
  3590. litest_assert_only_axis_events(li,
  3591. LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  3592. }
  3593. litest_touch_up(touchpad, 0);
  3594. litest_dispatch(li);
  3595. }
  3596. END_TEST
  3597. START_TEST(touchpad_dwt_dont_interrupt_gesture_swipe)
  3598. {
  3599. struct litest_device *touchpad = litest_current_device();
  3600. struct libinput *li = touchpad->libinput;
  3601. if (litest_slot_count(touchpad) < 3 ||
  3602. !libinput_device_has_capability(touchpad->libinput_device,
  3603. LIBINPUT_DEVICE_CAP_GESTURE))
  3604. return LITEST_NOT_APPLICABLE;
  3605. if (!has_disable_while_typing(touchpad))
  3606. return LITEST_NOT_APPLICABLE;
  3607. _destroy_(litest_device) *keyboard = dwt_init_paired_keyboard(li, touchpad);
  3608. litest_drain_events(li);
  3609. litest_log_group("Start gesture") {
  3610. litest_touch_down(touchpad, 0, 40, 40);
  3611. litest_touch_down(touchpad, 1, 50, 40);
  3612. litest_touch_down(touchpad, 2, 60, 40);
  3613. litest_dispatch(li);
  3614. litest_touch_move_three_touches(touchpad,
  3615. 40,
  3616. 40,
  3617. 50,
  3618. 40,
  3619. 60,
  3620. 40,
  3621. 20,
  3622. 20,
  3623. 10);
  3624. litest_dispatch(li);
  3625. litest_disable_hold_gestures(touchpad->libinput_device);
  3626. litest_assert_gesture_event(li, LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN, 3);
  3627. litest_drain_events_of_type(li, LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE);
  3628. }
  3629. litest_log_group("Trigger key events") {
  3630. litest_keyboard_key(keyboard, KEY_A, true);
  3631. litest_keyboard_key(keyboard, KEY_A, false);
  3632. litest_dispatch(li);
  3633. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
  3634. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
  3635. litest_keyboard_key(keyboard, KEY_B, true);
  3636. litest_keyboard_key(keyboard, KEY_B, false);
  3637. litest_dispatch(li);
  3638. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_PRESSED);
  3639. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_RELEASED);
  3640. }
  3641. litest_log_group("Move during dwt timeout") {
  3642. litest_touch_move_three_touches(touchpad,
  3643. 60,
  3644. 60,
  3645. 70,
  3646. 60,
  3647. 80,
  3648. 60,
  3649. -20,
  3650. -20,
  3651. 10);
  3652. litest_dispatch(li);
  3653. bool have_events = false;
  3654. while (libinput_next_event_type(li)) {
  3655. litest_assert_gesture_event(li,
  3656. LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE,
  3657. 3);
  3658. have_events = true;
  3659. }
  3660. litest_assert(have_events);
  3661. }
  3662. litest_log_group("End gesture") {
  3663. litest_touch_up(touchpad, 0);
  3664. litest_touch_up(touchpad, 1);
  3665. litest_touch_up(touchpad, 2);
  3666. litest_dispatch(li);
  3667. _destroy_(libinput_event) *event = libinput_get_event(li);
  3668. auto gevent = litest_is_gesture_event(event,
  3669. LIBINPUT_EVENT_GESTURE_SWIPE_END,
  3670. 3);
  3671. litest_assert(!libinput_event_gesture_get_cancelled(gevent));
  3672. }
  3673. }
  3674. END_TEST
  3675. START_TEST(touchpad_dwt_dont_interrupt_gesture_pinch)
  3676. {
  3677. struct litest_device *touchpad = litest_current_device();
  3678. struct libinput *li = touchpad->libinput;
  3679. double x1 = 40.0, y1 = 40.0;
  3680. double x2 = 50.0, y2 = 50.0;
  3681. if (litest_slot_count(touchpad) < 2 ||
  3682. !libinput_device_has_capability(touchpad->libinput_device,
  3683. LIBINPUT_DEVICE_CAP_GESTURE))
  3684. return LITEST_NOT_APPLICABLE;
  3685. if (!has_disable_while_typing(touchpad))
  3686. return LITEST_NOT_APPLICABLE;
  3687. _destroy_(litest_device) *keyboard = dwt_init_paired_keyboard(li, touchpad);
  3688. litest_drain_events(li);
  3689. litest_log_group("Start gesture") {
  3690. litest_touch_down(touchpad, 0, x1, y1);
  3691. litest_touch_down(touchpad, 1, x2, y2);
  3692. litest_dispatch(li);
  3693. for (int i = 0; i < 10; i++) {
  3694. litest_push_event_frame(touchpad);
  3695. x1 -= 1.0;
  3696. y1 -= 1.0;
  3697. x2 += 1.0;
  3698. y2 += 1.0;
  3699. litest_touch_move(touchpad, 0, x1, y1);
  3700. litest_touch_move(touchpad, 1, x2, y2);
  3701. litest_pop_event_frame(touchpad);
  3702. litest_dispatch(li);
  3703. }
  3704. litest_disable_hold_gestures(touchpad->libinput_device);
  3705. litest_assert_gesture_event(li, LIBINPUT_EVENT_GESTURE_PINCH_BEGIN, 2);
  3706. litest_drain_events_of_type(li, LIBINPUT_EVENT_GESTURE_PINCH_UPDATE);
  3707. }
  3708. litest_log_group("Trigger key events") {
  3709. litest_keyboard_key(keyboard, KEY_A, true);
  3710. litest_keyboard_key(keyboard, KEY_A, false);
  3711. litest_dispatch(li);
  3712. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
  3713. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
  3714. litest_keyboard_key(keyboard, KEY_B, true);
  3715. litest_keyboard_key(keyboard, KEY_B, false);
  3716. litest_dispatch(li);
  3717. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_PRESSED);
  3718. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_RELEASED);
  3719. }
  3720. litest_log_group("Move during dwt timeout") {
  3721. for (int i = 0; i < 10; i++) {
  3722. litest_push_event_frame(touchpad);
  3723. x1 -= 1.0;
  3724. y1 -= 1.0;
  3725. x2 += 1.0;
  3726. y2 += 1.0;
  3727. litest_touch_move(touchpad, 0, x1, y1);
  3728. litest_touch_move(touchpad, 1, x2, y2);
  3729. litest_pop_event_frame(touchpad);
  3730. litest_dispatch(li);
  3731. }
  3732. litest_dispatch(li);
  3733. bool have_events = false;
  3734. while (libinput_next_event_type(li)) {
  3735. litest_assert_gesture_event(li,
  3736. LIBINPUT_EVENT_GESTURE_PINCH_UPDATE,
  3737. 2);
  3738. have_events = true;
  3739. }
  3740. litest_assert(have_events);
  3741. }
  3742. litest_log_group("End gesture") {
  3743. litest_touch_up(touchpad, 0);
  3744. litest_touch_up(touchpad, 1);
  3745. litest_dispatch(li);
  3746. _destroy_(libinput_event) *event = libinput_get_event(li);
  3747. auto gevent = litest_is_gesture_event(event,
  3748. LIBINPUT_EVENT_GESTURE_PINCH_END,
  3749. 2);
  3750. litest_assert(!libinput_event_gesture_get_cancelled(gevent));
  3751. }
  3752. }
  3753. END_TEST
  3754. START_TEST(touchpad_dwt_dont_interrupt_tap_drag)
  3755. {
  3756. struct litest_device *touchpad = litest_current_device();
  3757. struct libinput *li = touchpad->libinput;
  3758. if (!has_disable_while_typing(touchpad))
  3759. return LITEST_NOT_APPLICABLE;
  3760. _destroy_(litest_device) *keyboard = dwt_init_paired_keyboard(li, touchpad);
  3761. litest_enable_tap(touchpad->libinput_device);
  3762. litest_disable_drag_lock(touchpad->libinput_device);
  3763. litest_disable_hold_gestures(touchpad->libinput_device);
  3764. litest_drain_events(li);
  3765. litest_log_group("Tap and finger down again") {
  3766. litest_touch_down(touchpad, 0, 50, 50);
  3767. litest_touch_up(touchpad, 0);
  3768. /* Touch down again to start tap-drag */
  3769. litest_touch_down(touchpad, 0, 50, 50);
  3770. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  3771. litest_dispatch(li);
  3772. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  3773. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3774. }
  3775. litest_log_group("Trigger key events") {
  3776. litest_keyboard_key(keyboard, KEY_A, true);
  3777. litest_keyboard_key(keyboard, KEY_A, false);
  3778. litest_dispatch(li);
  3779. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
  3780. litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
  3781. litest_keyboard_key(keyboard, KEY_B, true);
  3782. litest_keyboard_key(keyboard, KEY_B, false);
  3783. litest_dispatch(li);
  3784. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_PRESSED);
  3785. litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_RELEASED);
  3786. }
  3787. litest_log_group("Pointer motion events") {
  3788. litest_touch_move_to(touchpad, 0, 70, 50, 50, 70, 10);
  3789. litest_dispatch(li);
  3790. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3791. }
  3792. litest_touch_up(touchpad, 0);
  3793. litest_dispatch(li);
  3794. litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  3795. litest_assert_empty_queue(li);
  3796. }
  3797. END_TEST
  3798. START_TEST(touchpad_dwt_dont_interrupt_buttons)
  3799. {
  3800. struct litest_device *touchpad = litest_current_device();
  3801. struct libinput *li = touchpad->libinput;
  3802. if (!has_disable_while_typing(touchpad))
  3803. return LITEST_NOT_APPLICABLE;
  3804. _destroy_(litest_device) *keyboard = dwt_init_paired_keyboard(li, touchpad);
  3805. litest_disable_tap(touchpad->libinput_device);
  3806. litest_disable_hold_gestures(touchpad->libinput_device);
  3807. litest_drain_events(li);
  3808. litest_log_group("Press button") {
  3809. litest_touch_down(touchpad, 0, 50, 50);
  3810. litest_button_click(touchpad, BTN_LEFT, true);
  3811. litest_touch_move_to(touchpad, 0, 50, 50, 55, 50, 5);
  3812. litest_dispatch(li);
  3813. /* middle button emulation may delay the button event,
  3814. * wait for the timeout to fire before draining */
  3815. litest_timeout_middlebutton(li);
  3816. litest_drain_events(li);
  3817. }
  3818. litest_log_group("Trigger key events") {
  3819. litest_keyboard_key(keyboard, KEY_A, true);
  3820. litest_keyboard_key(keyboard, KEY_A, false);
  3821. litest_dispatch(li);
  3822. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3823. }
  3824. litest_log_group("Move while button held") {
  3825. litest_touch_move_to(touchpad, 0, 55, 50, 70, 50, 10);
  3826. litest_dispatch(li);
  3827. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3828. }
  3829. litest_button_click(touchpad, BTN_LEFT, false);
  3830. litest_touch_up(touchpad, 0);
  3831. litest_dispatch(li);
  3832. }
  3833. END_TEST
  3834. START_TEST(touchpad_dwt_dont_interrupt_pointer_motion)
  3835. {
  3836. struct litest_device *touchpad = litest_current_device();
  3837. struct libinput *li = touchpad->libinput;
  3838. if (!has_disable_while_typing(touchpad))
  3839. return LITEST_NOT_APPLICABLE;
  3840. _destroy_(litest_device) *keyboard = dwt_init_paired_keyboard(li, touchpad);
  3841. litest_disable_tap(touchpad->libinput_device);
  3842. litest_disable_hold_gestures(touchpad->libinput_device);
  3843. litest_drain_events(li);
  3844. /* Start moving the pointer - move enough to exceed 20mm
  3845. * cumulative distance. The movement needs to span most of the
  3846. * touchpad width to ensure >20mm on all test devices.
  3847. */
  3848. litest_touch_down(touchpad, 0, 10, 50);
  3849. litest_touch_move_to(touchpad, 0, 10, 50, 80, 50, 40);
  3850. litest_dispatch(li);
  3851. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3852. /* Wait more than 500ms to exceed the time threshold */
  3853. litest_timeout(li, 600);
  3854. /* Move a bit more to generate new events */
  3855. litest_touch_move_to(touchpad, 0, 80, 50, 85, 50, 5);
  3856. litest_dispatch(li);
  3857. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3858. /* Press a key - should NOT trigger DWT because the touch
  3859. * has been moving for >500ms and >20mm cumulative distance
  3860. */
  3861. litest_keyboard_key(keyboard, KEY_A, true);
  3862. litest_keyboard_key(keyboard, KEY_A, false);
  3863. litest_dispatch(li);
  3864. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3865. /* Continue moving - should still produce motion events */
  3866. litest_touch_move_to(touchpad, 0, 85, 50, 90, 50, 10);
  3867. litest_dispatch(li);
  3868. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  3869. litest_touch_up(touchpad, 0);
  3870. litest_dispatch(li);
  3871. }
  3872. END_TEST
  3873. START_TEST(touchpad_dwt_pointer_motion_short_no_protect)
  3874. {
  3875. struct litest_device *touchpad = litest_current_device();
  3876. struct libinput *li = touchpad->libinput;
  3877. if (!has_disable_while_typing(touchpad))
  3878. return LITEST_NOT_APPLICABLE;
  3879. _destroy_(litest_device) *keyboard = dwt_init_paired_keyboard(li, touchpad);
  3880. litest_disable_tap(touchpad->libinput_device);
  3881. litest_disable_hold_gestures(touchpad->libinput_device);
  3882. litest_drain_events(li);
  3883. /* Move the pointer but not enough cumulative distance to
  3884. * exceed 20mm
  3885. */
  3886. litest_touch_down(touchpad, 0, 50, 50);
  3887. litest_touch_move_to(touchpad, 0, 50, 50, 55, 50, 5);
  3888. litest_dispatch(li);
  3889. litest_drain_events(li);
  3890. /* Wait more than 500ms */
  3891. litest_timeout(li, 600);
  3892. /* Press a key - should trigger DWT because the touch hasn't
  3893. * moved far enough (< 20mm)
  3894. */
  3895. litest_keyboard_key(keyboard, KEY_A, true);
  3896. litest_keyboard_key(keyboard, KEY_A, false);
  3897. litest_dispatch(li);
  3898. /* Touch should now be blocked by DWT */
  3899. litest_touch_move_to(touchpad, 0, 55, 50, 70, 50, 10);
  3900. litest_touch_up(touchpad, 0);
  3901. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  3902. }
  3903. END_TEST
  3904. START_TEST(touchpad_dwt_config_default_timeout)
  3905. {
  3906. struct litest_device *dev = litest_current_device();
  3907. struct libinput_device *device = dev->libinput_device;
  3908. if (!libinput_device_config_dwt_is_available(device))
  3909. return LITEST_NOT_APPLICABLE;
  3910. litest_assert_int_eq(libinput_device_config_dwt_get_default_timeout(device),
  3911. 500U);
  3912. }
  3913. END_TEST
  3914. START_TEST(touchpad_dwt_config_default_on)
  3915. {
  3916. struct litest_device *dev = litest_current_device();
  3917. struct libinput_device *device = dev->libinput_device;
  3918. enum libinput_config_status status;
  3919. enum libinput_config_dwt_state state;
  3920. if (libevdev_get_id_vendor(dev->evdev) == VENDOR_ID_WACOM ||
  3921. libevdev_get_id_bustype(dev->evdev) == BUS_BLUETOOTH) {
  3922. litest_assert(!libinput_device_config_dwt_is_available(device));
  3923. return LITEST_NOT_APPLICABLE;
  3924. }
  3925. litest_assert(libinput_device_config_dwt_is_available(device));
  3926. state = libinput_device_config_dwt_get_enabled(device);
  3927. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWT_ENABLED);
  3928. state = libinput_device_config_dwt_get_default_enabled(device);
  3929. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWT_ENABLED);
  3930. uint32_t timeout = libinput_device_config_dwt_get_timeout(device);
  3931. litest_assert_int_eq(timeout, 500U);
  3932. status = libinput_device_config_dwt_set_enabled(device,
  3933. LIBINPUT_CONFIG_DWT_ENABLED);
  3934. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  3935. status = libinput_device_config_dwt_set_enabled(device,
  3936. LIBINPUT_CONFIG_DWT_DISABLED);
  3937. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  3938. status = libinput_device_config_dwt_set_enabled(device, 3);
  3939. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  3940. /* Configurable even if disabled */
  3941. status = libinput_device_config_dwt_set_timeout(device, 600);
  3942. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  3943. timeout = libinput_device_config_dwt_get_timeout(device);
  3944. litest_assert_int_eq(timeout, 600U);
  3945. /* Too short, too long */
  3946. status = libinput_device_config_dwt_set_timeout(device, 99);
  3947. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  3948. timeout = libinput_device_config_dwt_get_timeout(device);
  3949. litest_assert_int_eq(timeout, 600U);
  3950. status = libinput_device_config_dwt_set_timeout(device, 5001);
  3951. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  3952. timeout = libinput_device_config_dwt_get_timeout(device);
  3953. litest_assert_int_eq(timeout, 600U);
  3954. }
  3955. END_TEST
  3956. START_TEST(touchpad_dwtp_config_default_timeout)
  3957. {
  3958. struct litest_device *dev = litest_current_device();
  3959. struct libinput_device *device = dev->libinput_device;
  3960. if (!libinput_device_config_dwtp_is_available(device))
  3961. return LITEST_NOT_APPLICABLE;
  3962. litest_assert_int_eq(libinput_device_config_dwtp_get_default_timeout(device),
  3963. 300U);
  3964. }
  3965. END_TEST
  3966. START_TEST(touchpad_dwtp_config_default_on)
  3967. {
  3968. struct litest_device *dev = litest_current_device();
  3969. struct libinput_device *device = dev->libinput_device;
  3970. enum libinput_config_status status;
  3971. enum libinput_config_dwtp_state state;
  3972. if (litest_touchpad_is_external(dev)) {
  3973. litest_assert(!libinput_device_config_dwtp_is_available(device));
  3974. return LITEST_NOT_APPLICABLE;
  3975. }
  3976. litest_assert(libinput_device_config_dwtp_is_available(device));
  3977. state = libinput_device_config_dwtp_get_enabled(device);
  3978. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWTP_ENABLED);
  3979. state = libinput_device_config_dwtp_get_default_enabled(device);
  3980. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWTP_ENABLED);
  3981. status = libinput_device_config_dwtp_set_enabled(device,
  3982. LIBINPUT_CONFIG_DWTP_ENABLED);
  3983. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  3984. status = libinput_device_config_dwtp_set_enabled(device,
  3985. LIBINPUT_CONFIG_DWTP_DISABLED);
  3986. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  3987. status = libinput_device_config_dwtp_set_enabled(device, 3);
  3988. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  3989. }
  3990. END_TEST
  3991. START_TEST(touchpad_dwt_config_default_off)
  3992. {
  3993. struct litest_device *dev = litest_current_device();
  3994. struct libinput_device *device = dev->libinput_device;
  3995. enum libinput_config_status status;
  3996. enum libinput_config_dwt_state state;
  3997. litest_assert(!libinput_device_config_dwt_is_available(device));
  3998. state = libinput_device_config_dwt_get_enabled(device);
  3999. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWT_DISABLED);
  4000. state = libinput_device_config_dwt_get_default_enabled(device);
  4001. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWT_DISABLED);
  4002. status = libinput_device_config_dwt_set_enabled(device,
  4003. LIBINPUT_CONFIG_DWT_ENABLED);
  4004. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
  4005. status = libinput_device_config_dwt_set_enabled(device,
  4006. LIBINPUT_CONFIG_DWT_DISABLED);
  4007. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  4008. status = libinput_device_config_dwt_set_enabled(device, 3);
  4009. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  4010. }
  4011. END_TEST
  4012. START_TEST(touchpad_dwtp_config_default_off)
  4013. {
  4014. struct litest_device *dev = litest_current_device();
  4015. struct libinput_device *device = dev->libinput_device;
  4016. enum libinput_config_status status;
  4017. enum libinput_config_dwtp_state state;
  4018. litest_assert(!libinput_device_config_dwtp_is_available(device));
  4019. state = libinput_device_config_dwtp_get_enabled(device);
  4020. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWTP_DISABLED);
  4021. state = libinput_device_config_dwtp_get_default_enabled(device);
  4022. litest_assert_enum_eq(state, LIBINPUT_CONFIG_DWTP_DISABLED);
  4023. status = libinput_device_config_dwtp_set_enabled(device,
  4024. LIBINPUT_CONFIG_DWTP_ENABLED);
  4025. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
  4026. status = libinput_device_config_dwtp_set_enabled(device,
  4027. LIBINPUT_CONFIG_DWTP_DISABLED);
  4028. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  4029. status = libinput_device_config_dwtp_set_enabled(device, 3);
  4030. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_INVALID);
  4031. }
  4032. END_TEST
  4033. static inline void
  4034. disable_dwt(struct litest_device *dev)
  4035. {
  4036. enum libinput_config_status status, expected = LIBINPUT_CONFIG_STATUS_SUCCESS;
  4037. status = libinput_device_config_dwt_set_enabled(dev->libinput_device,
  4038. LIBINPUT_CONFIG_DWT_DISABLED);
  4039. litest_assert_int_eq(status, expected);
  4040. }
  4041. static inline void
  4042. enable_dwt(struct litest_device *dev)
  4043. {
  4044. enum libinput_config_status status, expected = LIBINPUT_CONFIG_STATUS_SUCCESS;
  4045. status = libinput_device_config_dwt_set_enabled(dev->libinput_device,
  4046. LIBINPUT_CONFIG_DWT_ENABLED);
  4047. litest_assert_int_eq(status, expected);
  4048. }
  4049. START_TEST(touchpad_dwt_disabled)
  4050. {
  4051. struct litest_device *touchpad = litest_current_device();
  4052. struct litest_device *keyboard;
  4053. struct libinput *li = touchpad->libinput;
  4054. if (!has_disable_while_typing(touchpad))
  4055. return LITEST_NOT_APPLICABLE;
  4056. disable_dwt(touchpad);
  4057. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4058. litest_disable_tap(touchpad->libinput_device);
  4059. litest_disable_hold_gestures(touchpad->libinput_device);
  4060. litest_drain_events(li);
  4061. litest_keyboard_key(keyboard, KEY_A, true);
  4062. litest_keyboard_key(keyboard, KEY_A, false);
  4063. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4064. litest_touch_down(touchpad, 0, 50, 50);
  4065. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4066. litest_touch_up(touchpad, 0);
  4067. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4068. litest_device_destroy(keyboard);
  4069. }
  4070. END_TEST
  4071. START_TEST(touchpad_dwt_disable_during_touch)
  4072. {
  4073. struct litest_device *touchpad = litest_current_device();
  4074. struct litest_device *keyboard;
  4075. struct libinput *li = touchpad->libinput;
  4076. if (!has_disable_while_typing(touchpad))
  4077. return LITEST_NOT_APPLICABLE;
  4078. enable_dwt(touchpad);
  4079. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4080. litest_disable_tap(touchpad->libinput_device);
  4081. litest_disable_hold_gestures(touchpad->libinput_device);
  4082. litest_drain_events(li);
  4083. litest_keyboard_key(keyboard, KEY_A, true);
  4084. litest_keyboard_key(keyboard, KEY_A, false);
  4085. litest_touch_down(touchpad, 0, 50, 50);
  4086. litest_keyboard_key(keyboard, KEY_A, true);
  4087. litest_keyboard_key(keyboard, KEY_A, false);
  4088. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4089. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4090. litest_assert_empty_queue(li);
  4091. litest_timeout_dwt_long(li);
  4092. disable_dwt(touchpad);
  4093. /* touch already down -> keeps being ignored */
  4094. litest_touch_move_to(touchpad, 0, 70, 50, 50, 70, 10);
  4095. litest_touch_up(touchpad, 0);
  4096. litest_assert_empty_queue(li);
  4097. litest_device_destroy(keyboard);
  4098. }
  4099. END_TEST
  4100. START_TEST(touchpad_dwt_disable_before_touch)
  4101. {
  4102. struct litest_device *touchpad = litest_current_device();
  4103. struct litest_device *keyboard;
  4104. struct libinput *li = touchpad->libinput;
  4105. if (!has_disable_while_typing(touchpad))
  4106. return LITEST_NOT_APPLICABLE;
  4107. enable_dwt(touchpad);
  4108. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4109. litest_disable_tap(touchpad->libinput_device);
  4110. litest_disable_hold_gestures(touchpad->libinput_device);
  4111. litest_drain_events(li);
  4112. litest_keyboard_key(keyboard, KEY_A, true);
  4113. litest_keyboard_key(keyboard, KEY_A, false);
  4114. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4115. disable_dwt(touchpad);
  4116. litest_dispatch(li);
  4117. /* touch down during timeout -> still discarded */
  4118. litest_touch_down(touchpad, 0, 50, 50);
  4119. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4120. litest_assert_empty_queue(li);
  4121. litest_device_destroy(keyboard);
  4122. }
  4123. END_TEST
  4124. START_TEST(touchpad_dwt_disable_during_key_release)
  4125. {
  4126. struct litest_device *touchpad = litest_current_device();
  4127. struct litest_device *keyboard;
  4128. struct libinput *li = touchpad->libinput;
  4129. if (!has_disable_while_typing(touchpad))
  4130. return LITEST_NOT_APPLICABLE;
  4131. enable_dwt(touchpad);
  4132. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4133. litest_disable_tap(touchpad->libinput_device);
  4134. litest_disable_hold_gestures(touchpad->libinput_device);
  4135. litest_drain_events(li);
  4136. litest_keyboard_key(keyboard, KEY_A, true);
  4137. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4138. disable_dwt(touchpad);
  4139. litest_dispatch(li);
  4140. litest_keyboard_key(keyboard, KEY_A, false);
  4141. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4142. /* touch down during timeout, wait, should generate events */
  4143. litest_touch_down(touchpad, 0, 50, 50);
  4144. litest_timeout_dwt_long(li);
  4145. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4146. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4147. litest_device_destroy(keyboard);
  4148. }
  4149. END_TEST
  4150. START_TEST(touchpad_dwt_disable_during_key_hold)
  4151. {
  4152. struct litest_device *touchpad = litest_current_device();
  4153. struct litest_device *keyboard;
  4154. struct libinput *li = touchpad->libinput;
  4155. if (!has_disable_while_typing(touchpad))
  4156. return LITEST_NOT_APPLICABLE;
  4157. enable_dwt(touchpad);
  4158. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4159. litest_disable_tap(touchpad->libinput_device);
  4160. litest_disable_hold_gestures(touchpad->libinput_device);
  4161. litest_drain_events(li);
  4162. litest_keyboard_key(keyboard, KEY_A, true);
  4163. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4164. disable_dwt(touchpad);
  4165. litest_dispatch(li);
  4166. /* touch down during timeout, wait, should generate events */
  4167. litest_touch_down(touchpad, 0, 50, 50);
  4168. litest_timeout_dwt_long(li);
  4169. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4170. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4171. litest_device_destroy(keyboard);
  4172. }
  4173. END_TEST
  4174. START_TEST(touchpad_dwt_enable_during_touch)
  4175. {
  4176. struct litest_device *touchpad = litest_current_device();
  4177. struct litest_device *keyboard;
  4178. struct libinput *li = touchpad->libinput;
  4179. if (!has_disable_while_typing(touchpad))
  4180. return LITEST_NOT_APPLICABLE;
  4181. disable_dwt(touchpad);
  4182. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4183. litest_disable_tap(touchpad->libinput_device);
  4184. litest_disable_hold_gestures(touchpad->libinput_device);
  4185. litest_drain_events(li);
  4186. litest_keyboard_key(keyboard, KEY_A, true);
  4187. litest_keyboard_key(keyboard, KEY_A, false);
  4188. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4189. litest_touch_down(touchpad, 0, 50, 50);
  4190. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4191. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4192. enable_dwt(touchpad);
  4193. /* touch already down -> still sends events */
  4194. litest_touch_move_to(touchpad, 0, 70, 50, 50, 70, 10);
  4195. litest_touch_up(touchpad, 0);
  4196. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4197. litest_device_destroy(keyboard);
  4198. }
  4199. END_TEST
  4200. START_TEST(touchpad_dwt_enable_before_touch)
  4201. {
  4202. struct litest_device *touchpad = litest_current_device();
  4203. struct litest_device *keyboard;
  4204. struct libinput *li = touchpad->libinput;
  4205. if (!has_disable_while_typing(touchpad))
  4206. return LITEST_NOT_APPLICABLE;
  4207. disable_dwt(touchpad);
  4208. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4209. litest_disable_tap(touchpad->libinput_device);
  4210. litest_disable_hold_gestures(touchpad->libinput_device);
  4211. litest_drain_events(li);
  4212. litest_keyboard_key(keyboard, KEY_A, true);
  4213. litest_keyboard_key(keyboard, KEY_A, false);
  4214. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4215. enable_dwt(touchpad);
  4216. litest_dispatch(li);
  4217. litest_touch_down(touchpad, 0, 50, 50);
  4218. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4219. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4220. litest_device_destroy(keyboard);
  4221. }
  4222. END_TEST
  4223. START_TEST(touchpad_dwt_enable_during_tap)
  4224. {
  4225. struct litest_device *touchpad = litest_current_device();
  4226. struct litest_device *keyboard;
  4227. struct libinput *li = touchpad->libinput;
  4228. if (!has_disable_while_typing(touchpad))
  4229. return LITEST_NOT_APPLICABLE;
  4230. litest_enable_tap(touchpad->libinput_device);
  4231. disable_dwt(touchpad);
  4232. litest_disable_hold_gestures(touchpad->libinput_device);
  4233. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4234. litest_drain_events(li);
  4235. litest_keyboard_key(keyboard, KEY_A, true);
  4236. litest_keyboard_key(keyboard, KEY_A, false);
  4237. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4238. litest_touch_down(touchpad, 0, 50, 50);
  4239. litest_dispatch(li);
  4240. enable_dwt(touchpad);
  4241. litest_dispatch(li);
  4242. litest_touch_up(touchpad, 0);
  4243. litest_timeout_tap(li);
  4244. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
  4245. litest_touch_down(touchpad, 0, 50, 50);
  4246. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4247. litest_touch_up(touchpad, 0);
  4248. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4249. litest_device_destroy(keyboard);
  4250. }
  4251. END_TEST
  4252. START_TEST(touchpad_dwt_remove_kbd_while_active)
  4253. {
  4254. struct litest_device *touchpad = litest_current_device();
  4255. struct litest_device *keyboard;
  4256. struct libinput *li = touchpad->libinput;
  4257. if (!has_disable_while_typing(touchpad))
  4258. return LITEST_NOT_APPLICABLE;
  4259. litest_enable_tap(touchpad->libinput_device);
  4260. enable_dwt(touchpad);
  4261. litest_disable_hold_gestures(touchpad->libinput_device);
  4262. keyboard = dwt_init_paired_keyboard(li, touchpad);
  4263. litest_drain_events(li);
  4264. litest_keyboard_key(keyboard, KEY_A, true);
  4265. litest_keyboard_key(keyboard, KEY_A, false);
  4266. litest_dispatch(li);
  4267. litest_touch_down(touchpad, 0, 50, 50);
  4268. litest_dispatch(li);
  4269. litest_keyboard_key(keyboard, KEY_A, true);
  4270. litest_keyboard_key(keyboard, KEY_A, false);
  4271. litest_drain_events(li);
  4272. litest_device_destroy(keyboard);
  4273. litest_drain_events(li);
  4274. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4275. litest_touch_up(touchpad, 0);
  4276. litest_assert_empty_queue(li);
  4277. litest_touch_down(touchpad, 0, 50, 50);
  4278. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4279. litest_touch_up(touchpad, 0);
  4280. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4281. }
  4282. END_TEST
  4283. START_TEST(touchpad_dwt_apple)
  4284. {
  4285. struct litest_device *touchpad = litest_current_device();
  4286. struct litest_device *apple_keyboard;
  4287. struct libinput *li = touchpad->libinput;
  4288. litest_assert(has_disable_while_typing(touchpad));
  4289. apple_keyboard = litest_add_device(li, LITEST_APPLE_KEYBOARD);
  4290. litest_drain_events(li);
  4291. litest_keyboard_key(apple_keyboard, KEY_A, true);
  4292. litest_keyboard_key(apple_keyboard, KEY_A, false);
  4293. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4294. litest_touch_down(touchpad, 0, 50, 50);
  4295. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4296. litest_touch_up(touchpad, 0);
  4297. litest_dispatch(li);
  4298. litest_assert_empty_queue(li);
  4299. litest_device_destroy(apple_keyboard);
  4300. }
  4301. END_TEST
  4302. START_TEST(touchpad_dwt_acer_hawaii)
  4303. {
  4304. struct litest_device *touchpad = litest_current_device();
  4305. struct litest_device *hawaii_keyboard;
  4306. struct libinput *li = touchpad->libinput;
  4307. litest_assert(has_disable_while_typing(touchpad));
  4308. hawaii_keyboard = litest_add_device(li, LITEST_ACER_HAWAII_KEYBOARD);
  4309. litest_drain_events(li);
  4310. litest_keyboard_key(hawaii_keyboard, KEY_A, true);
  4311. litest_keyboard_key(hawaii_keyboard, KEY_A, false);
  4312. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4313. litest_touch_down(touchpad, 0, 50, 50);
  4314. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4315. litest_touch_up(touchpad, 0);
  4316. litest_dispatch(li);
  4317. litest_assert_empty_queue(li);
  4318. litest_device_destroy(hawaii_keyboard);
  4319. }
  4320. END_TEST
  4321. START_TEST(touchpad_dwt_generic_usbcombo)
  4322. {
  4323. struct litest_device *touchpad = litest_current_device();
  4324. struct litest_device *keyboard, *generic_keyboard;
  4325. struct libinput *li = touchpad->libinput;
  4326. litest_assert(has_disable_while_typing(touchpad));
  4327. /* Only the generic keyboard can trigger DWT */
  4328. keyboard = litest_add_device(li, LITEST_KEYBOARD);
  4329. litest_drain_events(li);
  4330. litest_keyboard_key(keyboard, KEY_A, true);
  4331. litest_keyboard_key(keyboard, KEY_A, false);
  4332. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4333. litest_touch_down(touchpad, 0, 50, 50);
  4334. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4335. litest_touch_up(touchpad, 0);
  4336. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4337. generic_keyboard = litest_add_device(li, LITEST_GENERIC_USBCOMBO_KEYBOARD);
  4338. litest_drain_events(li);
  4339. litest_keyboard_key(generic_keyboard, KEY_A, true);
  4340. litest_keyboard_key(generic_keyboard, KEY_A, false);
  4341. litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
  4342. litest_touch_down(touchpad, 0, 50, 50);
  4343. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4344. litest_touch_up(touchpad, 0);
  4345. litest_dispatch(li);
  4346. litest_assert_empty_queue(li);
  4347. litest_device_destroy(keyboard);
  4348. litest_device_destroy(generic_keyboard);
  4349. }
  4350. END_TEST
  4351. START_TEST(touchpad_dwt_multiple_keyboards)
  4352. {
  4353. struct litest_device *touchpad = litest_current_device();
  4354. struct litest_device *k1, *k2;
  4355. struct libinput *li = touchpad->libinput;
  4356. litest_assert(has_disable_while_typing(touchpad));
  4357. enable_dwt(touchpad);
  4358. k1 = litest_add_device(li, LITEST_KEYBOARD);
  4359. k2 = litest_add_device(li, LITEST_KEYBOARD);
  4360. litest_keyboard_key(k1, KEY_A, true);
  4361. litest_keyboard_key(k1, KEY_A, false);
  4362. litest_drain_events(li);
  4363. litest_touch_down(touchpad, 0, 50, 50);
  4364. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4365. litest_touch_up(touchpad, 0);
  4366. litest_assert_empty_queue(li);
  4367. litest_timeout_dwt_short(li);
  4368. litest_keyboard_key(k2, KEY_A, true);
  4369. litest_keyboard_key(k2, KEY_A, false);
  4370. litest_drain_events(li);
  4371. litest_touch_down(touchpad, 0, 50, 50);
  4372. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4373. litest_touch_up(touchpad, 0);
  4374. litest_assert_empty_queue(li);
  4375. litest_timeout_dwt_short(li);
  4376. litest_device_destroy(k1);
  4377. litest_device_destroy(k2);
  4378. }
  4379. END_TEST
  4380. START_TEST(touchpad_dwt_remove_before_keyboard)
  4381. {
  4382. struct litest_device *keyboard = litest_current_device();
  4383. struct litest_device *touchpad;
  4384. struct libinput *li = keyboard->libinput;
  4385. touchpad = litest_add_device(li, LITEST_SYNAPTICS_RMI4);
  4386. litest_assert(has_disable_while_typing(touchpad));
  4387. litest_dispatch(li);
  4388. /* remove the touchpad before the keyboard.
  4389. * this test can fail in valgrind only */
  4390. litest_device_destroy(touchpad);
  4391. }
  4392. END_TEST
  4393. START_TEST(touchpad_dwt_multiple_keyboards_bothkeys)
  4394. {
  4395. struct litest_device *touchpad = litest_current_device();
  4396. struct litest_device *k1, *k2;
  4397. struct libinput *li = touchpad->libinput;
  4398. litest_assert(has_disable_while_typing(touchpad));
  4399. enable_dwt(touchpad);
  4400. k1 = litest_add_device(li, LITEST_KEYBOARD);
  4401. k2 = litest_add_device(li, LITEST_KEYBOARD);
  4402. litest_keyboard_key(k1, KEY_A, true);
  4403. litest_keyboard_key(k1, KEY_A, false);
  4404. litest_keyboard_key(k2, KEY_B, true);
  4405. litest_keyboard_key(k2, KEY_B, false);
  4406. litest_drain_events(li);
  4407. litest_touch_down(touchpad, 0, 50, 50);
  4408. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4409. litest_touch_up(touchpad, 0);
  4410. litest_assert_empty_queue(li);
  4411. litest_device_destroy(k1);
  4412. litest_device_destroy(k2);
  4413. }
  4414. END_TEST
  4415. START_TEST(touchpad_dwt_multiple_keyboards_bothkeys_modifier)
  4416. {
  4417. struct litest_device *touchpad = litest_current_device();
  4418. struct litest_device *k1, *k2;
  4419. struct libinput *li = touchpad->libinput;
  4420. litest_assert(has_disable_while_typing(touchpad));
  4421. enable_dwt(touchpad);
  4422. k1 = litest_add_device(li, LITEST_KEYBOARD);
  4423. k2 = litest_add_device(li, LITEST_KEYBOARD);
  4424. litest_keyboard_key(k1, KEY_RIGHTCTRL, true);
  4425. litest_keyboard_key(k1, KEY_RIGHTCTRL, false);
  4426. litest_keyboard_key(k2, KEY_B, true);
  4427. litest_keyboard_key(k2, KEY_B, false);
  4428. litest_drain_events(li);
  4429. /* If the keyboard is a single physical device, the above should
  4430. * trigger the modifier behavior for dwt. But libinput views it as
  4431. * two separate devices and this is such a niche case that it
  4432. * doesn't matter. So we test for the easy behavior:
  4433. * ctrl+B across two devices is *not* a dwt modifier combo
  4434. */
  4435. litest_touch_down(touchpad, 0, 50, 50);
  4436. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4437. litest_touch_up(touchpad, 0);
  4438. litest_assert_empty_queue(li);
  4439. litest_device_destroy(k1);
  4440. litest_device_destroy(k2);
  4441. }
  4442. END_TEST
  4443. START_TEST(touchpad_dwt_multiple_keyboards_remove)
  4444. {
  4445. struct litest_device *touchpad = litest_current_device();
  4446. struct litest_device *keyboards[2];
  4447. struct libinput *li = touchpad->libinput;
  4448. int which = litest_test_param_get_i32(test_env->params, "which");
  4449. struct litest_device *removed, *remained;
  4450. litest_assert_int_le(which, 1);
  4451. litest_assert(has_disable_while_typing(touchpad));
  4452. enable_dwt(touchpad);
  4453. keyboards[0] = litest_add_device(li, LITEST_KEYBOARD);
  4454. keyboards[1] = litest_add_device(li, LITEST_KEYBOARD);
  4455. litest_keyboard_key(keyboards[0], KEY_A, true);
  4456. litest_keyboard_key(keyboards[0], KEY_A, false);
  4457. litest_keyboard_key(keyboards[1], KEY_B, true);
  4458. litest_keyboard_key(keyboards[1], KEY_B, false);
  4459. litest_drain_events(li);
  4460. litest_timeout_dwt_short(li);
  4461. removed = keyboards[which % 2];
  4462. remained = keyboards[(which + 1) % 2];
  4463. litest_device_destroy(removed);
  4464. litest_keyboard_key(remained, KEY_C, true);
  4465. litest_keyboard_key(remained, KEY_C, false);
  4466. litest_drain_events(li);
  4467. litest_touch_down(touchpad, 0, 50, 50);
  4468. litest_touch_move_to(touchpad, 0, 50, 50, 70, 50, 10);
  4469. litest_touch_up(touchpad, 0);
  4470. litest_assert_empty_queue(li);
  4471. litest_device_destroy(remained);
  4472. }
  4473. END_TEST
  4474. static int
  4475. has_thumb_detect(struct litest_device *dev)
  4476. {
  4477. double w, h;
  4478. if (libinput_device_get_size(dev->libinput_device, &w, &h) != 0)
  4479. return 0;
  4480. return h >= 50.0;
  4481. }
  4482. START_TEST(touchpad_thumb_lower_area_movement)
  4483. {
  4484. struct litest_device *dev = litest_current_device();
  4485. struct libinput *li = dev->libinput;
  4486. if (!has_thumb_detect(dev))
  4487. return LITEST_NOT_APPLICABLE;
  4488. litest_disable_tap(dev->libinput_device);
  4489. litest_disable_hold_gestures(dev->libinput_device);
  4490. litest_drain_events(li);
  4491. /* Thumb below lower line - slow movement - no events */
  4492. litest_touch_down(dev, 0, 50, 99);
  4493. litest_touch_move_to(dev, 0, 55, 99, 60, 99, 50);
  4494. litest_assert_empty_queue(li);
  4495. /* Thumb below lower line - fast movement - events */
  4496. litest_touch_move_to(dev, 0, 60, 99, 90, 99, 30);
  4497. litest_touch_up(dev, 0);
  4498. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4499. }
  4500. END_TEST
  4501. START_TEST(touchpad_thumb_lower_area_movement_rethumb)
  4502. {
  4503. struct litest_device *dev = litest_current_device();
  4504. struct libinput *li = dev->libinput;
  4505. if (!has_thumb_detect(dev))
  4506. return LITEST_NOT_APPLICABLE;
  4507. litest_disable_tap(dev->libinput_device);
  4508. litest_disable_hold_gestures(dev->libinput_device);
  4509. litest_drain_events(li);
  4510. /* Thumb below lower line - fast movement - events */
  4511. litest_touch_down(dev, 0, 50, 99);
  4512. litest_touch_move_to(dev, 0, 50, 99, 90, 99, 30);
  4513. litest_drain_events(li);
  4514. /* slow movement after being a non-touch - still events */
  4515. litest_touch_move_to(dev, 0, 90, 99, 60, 99, 50);
  4516. litest_touch_up(dev, 0);
  4517. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4518. }
  4519. END_TEST
  4520. START_TEST(touchpad_thumb_speed_empty_slots)
  4521. {
  4522. struct litest_device *dev = litest_current_device();
  4523. struct libinput *li = dev->libinput;
  4524. litest_disable_tap(dev->libinput_device);
  4525. litest_enable_2fg_scroll(dev);
  4526. litest_disable_hold_gestures(dev->libinput_device);
  4527. if (libevdev_get_num_slots(dev->evdev) < 3)
  4528. return LITEST_NOT_APPLICABLE;
  4529. litest_drain_events(li);
  4530. /* exceed the speed movement threshold in slot 0, then lift the
  4531. * finger */
  4532. litest_touch_down(dev, 0, 50, 20);
  4533. litest_touch_move_to(dev, 0, 50, 20, 70, 99, 15);
  4534. litest_touch_up(dev, 0);
  4535. litest_drain_events(li);
  4536. /* now scroll in slots 1 and 2, this should be a normal scroll event
  4537. * despite slot 0 exceeding the speed threshold earlier */
  4538. litest_touch_down(dev, 1, 50, 50);
  4539. litest_touch_down(dev, 2, 55, 50);
  4540. litest_dispatch(li);
  4541. for (int i = 0, y = 50; i < 10; i++, y++) {
  4542. litest_touch_move_to(dev, 1, 50, y, 50, y + 1, 1);
  4543. litest_touch_move_to(dev, 2, 55, y, 55, y + 1, 1);
  4544. }
  4545. litest_dispatch(li);
  4546. litest_touch_up(dev, 1);
  4547. litest_touch_up(dev, 2);
  4548. litest_dispatch(li);
  4549. litest_assert_scroll(li,
  4550. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  4551. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  4552. 2);
  4553. }
  4554. END_TEST
  4555. START_TEST(touchpad_thumb_area_clickfinger)
  4556. {
  4557. struct litest_device *dev = litest_current_device();
  4558. struct libinput *li = dev->libinput;
  4559. struct libinput_event *event;
  4560. if (!has_thumb_detect(dev))
  4561. return LITEST_NOT_APPLICABLE;
  4562. litest_disable_tap(dev->libinput_device);
  4563. litest_disable_hold_gestures(dev->libinput_device);
  4564. libinput_device_config_click_set_method(
  4565. dev->libinput_device,
  4566. LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER);
  4567. litest_drain_events(li);
  4568. litest_touch_down(dev, 0, 50, 99); /* thumb */
  4569. litest_dispatch(li);
  4570. litest_touch_down(dev, 1, 60, 50);
  4571. litest_dispatch(li);
  4572. litest_button_click(dev, BTN_LEFT, true);
  4573. litest_dispatch(li);
  4574. event = libinput_get_event(li);
  4575. litest_is_button_event(event, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  4576. libinput_event_destroy(event);
  4577. litest_assert_empty_queue(li);
  4578. litest_button_click(dev, BTN_LEFT, false);
  4579. litest_touch_up(dev, 0);
  4580. litest_touch_up(dev, 1);
  4581. litest_drain_events(li);
  4582. litest_touch_down(dev, 1, 60, 99); /* thumb */
  4583. litest_dispatch(li);
  4584. litest_touch_down(dev, 0, 50, 50);
  4585. litest_dispatch(li);
  4586. litest_button_click(dev, BTN_LEFT, true);
  4587. litest_dispatch(li);
  4588. event = libinput_get_event(li);
  4589. litest_is_button_event(event, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  4590. libinput_event_destroy(event);
  4591. litest_assert_empty_queue(li);
  4592. }
  4593. END_TEST
  4594. START_TEST(touchpad_thumb_area_btnarea)
  4595. {
  4596. struct litest_device *dev = litest_current_device();
  4597. struct libinput *li = dev->libinput;
  4598. struct libinput_event *event;
  4599. if (!has_thumb_detect(dev))
  4600. return LITEST_NOT_APPLICABLE;
  4601. litest_disable_tap(dev->libinput_device);
  4602. litest_disable_hold_gestures(dev->libinput_device);
  4603. libinput_device_config_click_set_method(
  4604. dev->libinput_device,
  4605. LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS);
  4606. litest_drain_events(li);
  4607. litest_touch_down(dev, 0, 90, 99); /* thumb */
  4608. litest_dispatch(li);
  4609. litest_button_click(dev, BTN_LEFT, true);
  4610. /* button areas work as usual with a thumb */
  4611. litest_dispatch(li);
  4612. event = libinput_get_event(li);
  4613. litest_is_button_event(event, BTN_RIGHT, LIBINPUT_BUTTON_STATE_PRESSED);
  4614. libinput_event_destroy(event);
  4615. litest_assert_empty_queue(li);
  4616. }
  4617. END_TEST
  4618. START_TEST(touchpad_thumb_no_doublethumb)
  4619. {
  4620. struct litest_device *dev = litest_current_device();
  4621. struct libinput *li = dev->libinput;
  4622. litest_disable_tap(dev->libinput_device);
  4623. litest_enable_clickfinger(dev);
  4624. litest_disable_hold_gestures(dev->libinput_device);
  4625. if (!has_thumb_detect(dev))
  4626. return LITEST_NOT_APPLICABLE;
  4627. litest_drain_events(li);
  4628. /* two touches in thumb area but we can't have two thumbs */
  4629. litest_touch_down(dev, 0, 50, 99);
  4630. /* random sleep interval. we don't have a thumb timer, but let's not
  4631. * put both touches down and move them immediately because that
  4632. * should always be a scroll event anyway. Go with a delay in
  4633. * between to make it more likely that this is really testing thumb
  4634. * detection.
  4635. */
  4636. msleep(200);
  4637. litest_dispatch(li);
  4638. litest_touch_down(dev, 1, 70, 99);
  4639. litest_dispatch(li);
  4640. litest_touch_move_two_touches(dev, 50, 99, 70, 99, 0, -20, 10);
  4641. litest_touch_up(dev, 0);
  4642. litest_touch_up(dev, 1);
  4643. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  4644. }
  4645. END_TEST
  4646. START_TEST(touchpad_tool_tripletap_touch_count)
  4647. {
  4648. struct litest_device *dev = litest_current_device();
  4649. struct libinput *li = dev->libinput;
  4650. struct libinput_event *event;
  4651. /* Synaptics touchpads sometimes end one touch point while
  4652. * simultaneously setting BTN_TOOL_TRIPLETAP.
  4653. * https://bugs.freedesktop.org/show_bug.cgi?id=91352
  4654. */
  4655. litest_drain_events(li);
  4656. litest_enable_clickfinger(dev);
  4657. /* touch 1 down */
  4658. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4659. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, 1);
  4660. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 1200);
  4661. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3200);
  4662. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 78);
  4663. litest_event(dev, EV_ABS, ABS_X, 1200);
  4664. litest_event(dev, EV_ABS, ABS_Y, 3200);
  4665. litest_event(dev, EV_ABS, ABS_PRESSURE, 78);
  4666. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  4667. litest_event(dev, EV_KEY, BTN_TOUCH, 1);
  4668. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4669. litest_dispatch(li);
  4670. msleep(2);
  4671. /* touch 2 down */
  4672. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  4673. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, 1);
  4674. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 3500);
  4675. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3500);
  4676. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 73);
  4677. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  4678. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  4679. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4680. litest_dispatch(li);
  4681. msleep(2);
  4682. /* touch 3 down, coordinate jump + ends slot 1 */
  4683. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4684. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 4000);
  4685. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 4000);
  4686. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 78);
  4687. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  4688. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  4689. litest_event(dev, EV_ABS, ABS_X, 4000);
  4690. litest_event(dev, EV_ABS, ABS_Y, 4000);
  4691. litest_event(dev, EV_ABS, ABS_PRESSURE, 78);
  4692. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  4693. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  4694. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4695. litest_dispatch(li);
  4696. msleep(2);
  4697. /* slot 2 reactivated */
  4698. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4699. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 4000);
  4700. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 4000);
  4701. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 78);
  4702. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  4703. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, 3);
  4704. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 3500);
  4705. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3500);
  4706. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 73);
  4707. litest_event(dev, EV_ABS, ABS_X, 4000);
  4708. litest_event(dev, EV_ABS, ABS_Y, 4000);
  4709. litest_event(dev, EV_ABS, ABS_PRESSURE, 78);
  4710. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4711. litest_dispatch(li);
  4712. msleep(2);
  4713. /* now a click should trigger middle click */
  4714. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  4715. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4716. litest_dispatch(li);
  4717. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  4718. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4719. litest_dispatch(li);
  4720. litest_wait_for_event(li);
  4721. event = libinput_get_event(li);
  4722. litest_is_button_event(event, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  4723. libinput_event_destroy(event);
  4724. event = libinput_get_event(li);
  4725. litest_is_button_event(event, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  4726. libinput_event_destroy(event);
  4727. /* release everything */
  4728. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4729. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  4730. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4731. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  4732. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  4733. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  4734. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  4735. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  4736. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4737. }
  4738. END_TEST
  4739. START_TEST(touchpad_tool_tripletap_touch_count_late)
  4740. {
  4741. struct litest_device *dev = litest_current_device();
  4742. struct libinput *li = dev->libinput;
  4743. struct libinput_event *event;
  4744. /* Synaptics touchpads sometimes end one touch point after
  4745. * setting BTN_TOOL_TRIPLETAP.
  4746. * https://gitlab.freedesktop.org/libinput/libinput/issues/99
  4747. */
  4748. litest_drain_events(li);
  4749. litest_enable_clickfinger(dev);
  4750. /* touch 1 down */
  4751. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4752. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, 1);
  4753. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 2200);
  4754. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3200);
  4755. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 78);
  4756. litest_event(dev, EV_ABS, ABS_X, 2200);
  4757. litest_event(dev, EV_ABS, ABS_Y, 3200);
  4758. litest_event(dev, EV_ABS, ABS_PRESSURE, 78);
  4759. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  4760. litest_event(dev, EV_KEY, BTN_TOUCH, 1);
  4761. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4762. litest_dispatch(li);
  4763. msleep(10);
  4764. /* touch 2 and TRIPLETAP down */
  4765. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  4766. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, 1);
  4767. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 3500);
  4768. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3500);
  4769. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 73);
  4770. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  4771. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  4772. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4773. litest_dispatch(li);
  4774. msleep(10);
  4775. /* touch 2 up, coordinate jump + ends slot 1, TRIPLETAP stays */
  4776. litest_disable_log_handler(li);
  4777. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4778. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 4000);
  4779. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 4000);
  4780. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 78);
  4781. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  4782. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  4783. litest_event(dev, EV_ABS, ABS_X, 4000);
  4784. litest_event(dev, EV_ABS, ABS_Y, 4000);
  4785. litest_event(dev, EV_ABS, ABS_PRESSURE, 78);
  4786. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4787. litest_dispatch(li);
  4788. msleep(10);
  4789. /* slot 2 reactivated */
  4790. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4791. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 4000);
  4792. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 4000);
  4793. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 78);
  4794. litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
  4795. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, 3);
  4796. litest_event(dev, EV_ABS, ABS_MT_POSITION_X, 3500);
  4797. litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, 3500);
  4798. litest_event(dev, EV_ABS, ABS_MT_PRESSURE, 73);
  4799. litest_event(dev, EV_ABS, ABS_X, 4000);
  4800. litest_event(dev, EV_ABS, ABS_Y, 4000);
  4801. litest_event(dev, EV_ABS, ABS_PRESSURE, 78);
  4802. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4803. litest_dispatch(li);
  4804. msleep(10);
  4805. litest_restore_log_handler(li);
  4806. /* now a click should trigger middle click */
  4807. litest_event(dev, EV_KEY, BTN_LEFT, 1);
  4808. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4809. litest_dispatch(li);
  4810. litest_event(dev, EV_KEY, BTN_LEFT, 0);
  4811. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4812. litest_dispatch(li);
  4813. litest_wait_for_event(li);
  4814. event = libinput_get_event(li);
  4815. litest_is_button_event(event, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  4816. libinput_event_destroy(event);
  4817. event = libinput_get_event(li);
  4818. litest_is_button_event(event, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  4819. libinput_event_destroy(event);
  4820. /* release everything */
  4821. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4822. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  4823. litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
  4824. litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
  4825. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  4826. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  4827. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  4828. litest_event(dev, EV_KEY, BTN_TOUCH, 0);
  4829. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4830. }
  4831. END_TEST
  4832. START_TEST(touchpad_slot_swap)
  4833. {
  4834. struct litest_device *dev = litest_current_device();
  4835. struct libinput *li = dev->libinput;
  4836. struct libinput_event *event;
  4837. int first, second;
  4838. /* Synaptics touchpads sometimes end the wrong touchpoint on finger
  4839. * up, causing the remaining slot to continue with the other slot's
  4840. * coordinates.
  4841. * https://bugs.freedesktop.org/show_bug.cgi?id=91352
  4842. */
  4843. litest_drain_events(li);
  4844. for (first = 0; first <= 1; first++) {
  4845. const double start[2][2] = { { 50, 50 }, { 60, 60 } };
  4846. second = 1 - first;
  4847. litest_touch_down(dev, 0, start[0][0], start[0][1]);
  4848. litest_dispatch(li);
  4849. litest_touch_down(dev, 1, start[1][0], start[1][1]);
  4850. litest_dispatch(li);
  4851. litest_touch_move_two_touches(dev,
  4852. start[first][0],
  4853. start[first][1],
  4854. start[second][0],
  4855. start[second][1],
  4856. 30,
  4857. 30,
  4858. 10);
  4859. litest_drain_events(li);
  4860. /* release touch 0, continue other slot with 0's coords */
  4861. litest_push_event_frame(dev);
  4862. litest_touch_up(dev, first);
  4863. litest_touch_move(dev,
  4864. second,
  4865. start[second][0] + 30,
  4866. start[second][1] + 30.1);
  4867. litest_pop_event_frame(dev);
  4868. litest_dispatch(li);
  4869. /* If a gesture was detected, we need to go past the gesture
  4870. * timeout to trigger events. So let's move a bit first to
  4871. * make sure it looks continuous, then wait, then move again
  4872. * to make sure we trigger events */
  4873. litest_touch_move_to(dev,
  4874. second,
  4875. start[first][0] + 30,
  4876. start[first][1] + 30,
  4877. 50,
  4878. 21,
  4879. 10);
  4880. litest_dispatch(li);
  4881. litest_timeout_gesture(li);
  4882. litest_dispatch(li);
  4883. /* drain a potential scroll stop */
  4884. litest_drain_events(li);
  4885. litest_touch_move_to(dev, second, 50, 21, 50, 11, 20);
  4886. litest_dispatch(li);
  4887. event = libinput_get_event(li);
  4888. do {
  4889. struct libinput_event_pointer *ptrev;
  4890. ptrev = litest_is_motion_event(event);
  4891. litest_assert_double_eq(libinput_event_pointer_get_dx(ptrev),
  4892. 0.0);
  4893. litest_assert_double_lt(libinput_event_pointer_get_dy(ptrev),
  4894. 1.0);
  4895. libinput_event_destroy(event);
  4896. event = libinput_get_event(li);
  4897. } while (event);
  4898. litest_assert_empty_queue(li);
  4899. litest_touch_up(dev, second);
  4900. }
  4901. }
  4902. END_TEST
  4903. START_TEST(touchpad_finger_always_down)
  4904. {
  4905. struct litest_device *dev = litest_current_device();
  4906. /* Set BTN_TOOL_FINGER before a new context is initialized */
  4907. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
  4908. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  4909. _litest_context_destroy_ struct libinput *li = litest_create_context();
  4910. libinput_path_add_device(li, libevdev_uinput_get_devnode(dev->uinput));
  4911. litest_drain_events(li);
  4912. litest_touch_down(dev, 0, 50, 50);
  4913. litest_dispatch(li);
  4914. litest_touch_move_to(dev, 0, 50, 50, 70, 50, 10);
  4915. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  4916. }
  4917. END_TEST
  4918. START_TEST(touchpad_time_usec)
  4919. {
  4920. struct litest_device *dev = litest_current_device();
  4921. struct libinput *li = dev->libinput;
  4922. struct libinput_event *event;
  4923. litest_disable_tap(dev->libinput_device);
  4924. litest_disable_hold_gestures(dev->libinput_device);
  4925. litest_drain_events(li);
  4926. litest_touch_down(dev, 0, 50, 50);
  4927. litest_touch_move_to(dev, 0, 50, 50, 80, 50, 20);
  4928. litest_touch_up(dev, 0);
  4929. litest_dispatch(li);
  4930. event = libinput_get_event(li);
  4931. litest_assert_notnull(event);
  4932. while (event) {
  4933. struct libinput_event_pointer *ptrev;
  4934. uint64_t utime;
  4935. ptrev = litest_is_motion_event(event);
  4936. utime = libinput_event_pointer_get_time_usec(ptrev);
  4937. litest_assert_int_eq(libinput_event_pointer_get_time(ptrev),
  4938. (uint32_t)(utime / 1000));
  4939. libinput_event_destroy(event);
  4940. event = libinput_get_event(li);
  4941. }
  4942. }
  4943. END_TEST
  4944. START_TEST(touchpad_jump_finger_motion)
  4945. {
  4946. struct litest_device *dev = litest_current_device();
  4947. struct libinput *li = dev->libinput;
  4948. struct libinput_event *event;
  4949. litest_touch_down(dev, 0, 20, 30);
  4950. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  4951. litest_drain_events(li);
  4952. /* this test uses a specific test device to trigger a >20mm jump to
  4953. * test jumps. These numbers may not work on any other device */
  4954. litest_disable_log_handler(li);
  4955. litest_touch_move_to(dev, 0, 90, 30, 20, 80, 1);
  4956. litest_assert_empty_queue(li);
  4957. litest_restore_log_handler(li);
  4958. litest_touch_move_to(dev, 0, 20, 80, 21, 81, 10);
  4959. litest_touch_up(dev, 0);
  4960. /* expect lots of little events, no big jump */
  4961. litest_dispatch(li);
  4962. event = libinput_get_event(li);
  4963. do {
  4964. struct libinput_event_pointer *ptrev;
  4965. double dx, dy;
  4966. ptrev = litest_is_motion_event(event);
  4967. dx = libinput_event_pointer_get_dx(ptrev);
  4968. dy = libinput_event_pointer_get_dy(ptrev);
  4969. litest_assert_int_lt(abs((int)dx), 20);
  4970. litest_assert_int_lt(abs((int)dy), 20);
  4971. libinput_event_destroy(event);
  4972. event = libinput_get_event(li);
  4973. } while (event != NULL);
  4974. }
  4975. END_TEST
  4976. START_TEST(touchpad_jump_delta)
  4977. {
  4978. struct litest_device *dev = litest_current_device();
  4979. struct libinput *li = dev->libinput;
  4980. struct libinput_event *event;
  4981. litest_touch_down(dev, 0, 20, 30);
  4982. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  4983. litest_drain_events(li);
  4984. /* this test uses a specific test device to trigger a >7mm but <20mm
  4985. * jump to test the delta jumps. These numbers may not work on any
  4986. * other device */
  4987. litest_disable_log_handler(li);
  4988. litest_touch_move(dev, 0, 90, 88);
  4989. litest_assert_empty_queue(li);
  4990. litest_restore_log_handler(li);
  4991. litest_touch_move_to(dev, 0, 90, 88, 91, 89, 10);
  4992. litest_touch_up(dev, 0);
  4993. /* expect lots of little events, no big jump */
  4994. litest_dispatch(li);
  4995. event = libinput_get_event(li);
  4996. do {
  4997. struct libinput_event_pointer *ptrev;
  4998. double dx, dy;
  4999. ptrev = litest_is_motion_event(event);
  5000. dx = libinput_event_pointer_get_dx(ptrev);
  5001. dy = libinput_event_pointer_get_dy(ptrev);
  5002. litest_assert_int_lt(abs((int)dx), 20);
  5003. litest_assert_int_lt(abs((int)dy), 20);
  5004. libinput_event_destroy(event);
  5005. event = libinput_get_event(li);
  5006. } while (event != NULL);
  5007. }
  5008. END_TEST
  5009. START_TEST(touchpad_disabled_on_mouse)
  5010. {
  5011. struct litest_device *dev = litest_current_device();
  5012. struct litest_device *mouse;
  5013. struct libinput *li = dev->libinput;
  5014. enum libinput_config_status status;
  5015. bool suspend = litest_test_param_get_bool(test_env->params, "suspend");
  5016. litest_drain_events(li);
  5017. litest_disable_hold_gestures(dev->libinput_device);
  5018. status = libinput_device_config_send_events_set_mode(
  5019. dev->libinput_device,
  5020. LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE);
  5021. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  5022. litest_touch_down(dev, 0, 20, 30);
  5023. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5024. litest_touch_up(dev, 0);
  5025. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5026. mouse = litest_add_device(li, LITEST_MOUSE);
  5027. litest_assert_only_typed_events(li, LIBINPUT_EVENT_DEVICE_ADDED);
  5028. /* Mouse hasn't sent events yet */
  5029. litest_touch_down(dev, 0, 20, 30);
  5030. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5031. litest_touch_up(dev, 0);
  5032. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5033. /* Now send the events */
  5034. litest_event(mouse, EV_REL, REL_X, -1);
  5035. litest_event(mouse, EV_REL, REL_Y, 1);
  5036. litest_event(mouse, EV_SYN, SYN_REPORT, 0);
  5037. litest_drain_events(li);
  5038. litest_touch_down(dev, 0, 20, 30);
  5039. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5040. litest_touch_up(dev, 0);
  5041. litest_assert_empty_queue(li);
  5042. if (suspend) {
  5043. /* Disable external mouse -> expect touchpad events */
  5044. status = libinput_device_config_send_events_set_mode(
  5045. mouse->libinput_device,
  5046. LIBINPUT_CONFIG_SEND_EVENTS_DISABLED);
  5047. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  5048. litest_touch_down(dev, 0, 20, 30);
  5049. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5050. litest_touch_up(dev, 0);
  5051. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5052. }
  5053. litest_device_destroy(mouse);
  5054. litest_assert_only_typed_events(li, LIBINPUT_EVENT_DEVICE_REMOVED);
  5055. litest_touch_down(dev, 0, 20, 30);
  5056. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5057. litest_touch_up(dev, 0);
  5058. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5059. }
  5060. END_TEST
  5061. START_TEST(touchpad_disabled_double_mouse)
  5062. {
  5063. struct litest_device *dev = litest_current_device();
  5064. struct litest_device *nonsending_mouse, *sending_mouse;
  5065. struct libinput *li = dev->libinput;
  5066. enum libinput_config_status status;
  5067. bool suspend_nonsending =
  5068. litest_test_param_get_bool(test_env->params, "suspend-nonsending");
  5069. int32_t remove = litest_test_param_get_i32(test_env->params, "remove");
  5070. litest_drain_events(li);
  5071. litest_disable_hold_gestures(dev->libinput_device);
  5072. status = libinput_device_config_send_events_set_mode(
  5073. dev->libinput_device,
  5074. LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE);
  5075. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  5076. litest_touch_down(dev, 0, 20, 30);
  5077. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5078. litest_touch_up(dev, 0);
  5079. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5080. nonsending_mouse = litest_add_device(li, LITEST_MOUSE);
  5081. sending_mouse = litest_add_device(li, LITEST_MOUSE_LOW_DPI);
  5082. litest_assert_only_typed_events(li, LIBINPUT_EVENT_DEVICE_ADDED);
  5083. /* Mouse hasn't sent events yet */
  5084. litest_touch_down(dev, 0, 20, 30);
  5085. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5086. litest_touch_up(dev, 0);
  5087. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5088. /* Now send the events */
  5089. litest_event(sending_mouse, EV_REL, REL_X, -1);
  5090. litest_event(sending_mouse, EV_REL, REL_Y, 1);
  5091. litest_event(sending_mouse, EV_SYN, SYN_REPORT, 0);
  5092. litest_drain_events(li);
  5093. if (suspend_nonsending) {
  5094. /* Disable one external mouse -> don't expect touchpad events */
  5095. status = libinput_device_config_send_events_set_mode(
  5096. nonsending_mouse->libinput_device,
  5097. LIBINPUT_CONFIG_SEND_EVENTS_DISABLED);
  5098. litest_assert_enum_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
  5099. }
  5100. litest_touch_down(dev, 0, 20, 30);
  5101. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5102. litest_touch_up(dev, 0);
  5103. litest_assert_empty_queue(li);
  5104. switch (remove) {
  5105. case 1:
  5106. litest_device_destroy(steal(&nonsending_mouse));
  5107. break;
  5108. case 2:
  5109. litest_device_destroy(steal(&sending_mouse));
  5110. break;
  5111. }
  5112. litest_assert_only_typed_events(li, LIBINPUT_EVENT_DEVICE_REMOVED);
  5113. litest_touch_down(dev, 0, 20, 30);
  5114. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5115. litest_touch_up(dev, 0);
  5116. /* Removing the only mouse that sent events should resume our touchpad */
  5117. switch (remove) {
  5118. case 1:
  5119. litest_assert_empty_queue(li);
  5120. break;
  5121. case 2:
  5122. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5123. break;
  5124. }
  5125. if (sending_mouse)
  5126. litest_device_destroy(steal(&sending_mouse));
  5127. if (nonsending_mouse)
  5128. litest_device_destroy(steal(&nonsending_mouse));
  5129. litest_assert_only_typed_events(li, LIBINPUT_EVENT_DEVICE_REMOVED);
  5130. litest_touch_down(dev, 0, 20, 30);
  5131. litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
  5132. litest_touch_up(dev, 0);
  5133. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5134. }
  5135. END_TEST
  5136. static inline bool
  5137. touchpad_has_pressure(struct litest_device *dev)
  5138. {
  5139. struct libevdev *evdev = dev->evdev;
  5140. if (dev->which == LITEST_SYNAPTICS_PRESSUREPAD)
  5141. return false;
  5142. if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_PRESSURE))
  5143. return libevdev_get_abs_resolution(evdev, ABS_MT_PRESSURE) == 0;
  5144. if (libevdev_has_event_code(evdev, EV_ABS, ABS_PRESSURE) &&
  5145. !libevdev_has_event_code(evdev, EV_ABS, ABS_MT_SLOT))
  5146. return true;
  5147. return false;
  5148. }
  5149. START_TEST(touchpad_pressure)
  5150. {
  5151. struct litest_device *dev = litest_current_device();
  5152. struct libinput *li = dev->libinput;
  5153. struct axis_replacement axes[] = {
  5154. { ABS_MT_PRESSURE, 1 },
  5155. { ABS_PRESSURE, 1 },
  5156. { -1, 0 },
  5157. };
  5158. double pressure; /* in percent */
  5159. double threshold = 12.0;
  5160. if (!touchpad_has_pressure(dev))
  5161. return LITEST_NOT_APPLICABLE;
  5162. litest_drain_events(li);
  5163. for (pressure = 1; pressure <= threshold + 1; pressure++) {
  5164. litest_axis_set_value(axes, ABS_MT_PRESSURE, pressure);
  5165. litest_axis_set_value(axes, ABS_PRESSURE, pressure);
  5166. litest_touch_down_extended(dev, 0, 50, 50, axes);
  5167. litest_touch_move_to_extended(dev, 0, 50, 50, 80, 80, axes, 10);
  5168. litest_touch_up(dev, 0);
  5169. if (pressure < threshold)
  5170. litest_assert_empty_queue(li);
  5171. else
  5172. litest_assert_only_typed_events(li,
  5173. LIBINPUT_EVENT_POINTER_MOTION);
  5174. }
  5175. }
  5176. END_TEST
  5177. START_TEST(touchpad_pressure_2fg)
  5178. {
  5179. struct litest_device *dev = litest_current_device();
  5180. struct libinput *li = dev->libinput;
  5181. struct axis_replacement axes[] = {
  5182. { ABS_MT_PRESSURE, 5 },
  5183. { ABS_PRESSURE, 5 },
  5184. { -1, 0 },
  5185. };
  5186. if (!touchpad_has_pressure(dev))
  5187. return LITEST_NOT_APPLICABLE;
  5188. litest_drain_events(li);
  5189. litest_touch_down(dev, 0, 30, 50);
  5190. litest_touch_down_extended(dev, 1, 50, 50, axes);
  5191. litest_dispatch(li);
  5192. litest_touch_move_to(dev, 0, 30, 50, 80, 80, 10);
  5193. litest_dispatch(li);
  5194. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5195. litest_touch_move_to_extended(dev, 1, 50, 50, 80, 80, axes, 10);
  5196. litest_assert_empty_queue(li);
  5197. litest_touch_move_to(dev, 0, 80, 80, 20, 50, 10);
  5198. litest_touch_move_to_extended(dev, 1, 80, 80, 50, 50, axes, 10);
  5199. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5200. }
  5201. END_TEST
  5202. START_TEST(touchpad_pressure_2fg_st)
  5203. {
  5204. struct litest_device *dev = litest_current_device();
  5205. struct libinput *li = dev->libinput;
  5206. struct axis_replacement axes[] = {
  5207. { ABS_MT_PRESSURE, 5 },
  5208. { ABS_PRESSURE, 5 },
  5209. { -1, 0 },
  5210. };
  5211. if (!touchpad_has_pressure(dev))
  5212. return LITEST_NOT_APPLICABLE;
  5213. /* This is a bit of a weird test. We expect two fingers to be down as
  5214. * soon as doubletap is set, regardless of pressure. But we don't
  5215. * have 2fg scrolling on st devices and 2 fingers down on a touchpad
  5216. * without 2fg scrolling simply does not generate events. But that's
  5217. * the same result as if the fingers were ignored because of
  5218. * pressure and we cannot know the difference.
  5219. * So this test only keeps your CPU warm, not much else.
  5220. */
  5221. litest_drain_events(li);
  5222. litest_touch_down_extended(dev, 0, 50, 50, axes);
  5223. litest_dispatch(li);
  5224. litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
  5225. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  5226. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  5227. litest_dispatch(li);
  5228. litest_touch_move_to_extended(dev, 0, 50, 50, 80, 80, axes, 10);
  5229. litest_assert_empty_queue(li);
  5230. }
  5231. END_TEST
  5232. START_TEST(touchpad_pressure_tap)
  5233. {
  5234. struct litest_device *dev = litest_current_device();
  5235. struct libinput *li = dev->libinput;
  5236. struct axis_replacement axes[] = {
  5237. { ABS_MT_PRESSURE, 5 },
  5238. { ABS_PRESSURE, 5 },
  5239. { -1, 0 },
  5240. };
  5241. if (!touchpad_has_pressure(dev))
  5242. return LITEST_NOT_APPLICABLE;
  5243. litest_enable_tap(dev->libinput_device);
  5244. litest_disable_hold_gestures(dev->libinput_device);
  5245. litest_drain_events(li);
  5246. litest_touch_down_extended(dev, 0, 50, 50, axes);
  5247. litest_dispatch(li);
  5248. litest_touch_up(dev, 0);
  5249. litest_assert_empty_queue(li);
  5250. }
  5251. END_TEST
  5252. START_TEST(touchpad_pressure_tap_2fg)
  5253. {
  5254. struct litest_device *dev = litest_current_device();
  5255. struct libinput *li = dev->libinput;
  5256. struct axis_replacement axes[] = {
  5257. { ABS_MT_PRESSURE, 5 },
  5258. { ABS_PRESSURE, 5 },
  5259. { -1, 0 },
  5260. };
  5261. if (!touchpad_has_pressure(dev))
  5262. return LITEST_NOT_APPLICABLE;
  5263. litest_enable_tap(dev->libinput_device);
  5264. litest_disable_hold_gestures(dev->libinput_device);
  5265. litest_drain_events(li);
  5266. /* tap but too light */
  5267. litest_touch_down_extended(dev, 0, 40, 50, axes);
  5268. litest_touch_down_extended(dev, 1, 50, 50, axes);
  5269. litest_dispatch(li);
  5270. litest_touch_up(dev, 0);
  5271. litest_touch_up(dev, 1);
  5272. litest_assert_empty_queue(li);
  5273. }
  5274. END_TEST
  5275. START_TEST(touchpad_pressure_tap_2fg_1fg_light)
  5276. {
  5277. struct litest_device *dev = litest_current_device();
  5278. struct libinput *li = dev->libinput;
  5279. struct libinput_event *event;
  5280. struct axis_replacement axes[] = {
  5281. { ABS_MT_PRESSURE, 5 },
  5282. { ABS_PRESSURE, 5 },
  5283. { -1, 0 },
  5284. };
  5285. if (!touchpad_has_pressure(dev))
  5286. return LITEST_NOT_APPLICABLE;
  5287. litest_enable_tap(dev->libinput_device);
  5288. litest_disable_hold_gestures(dev->libinput_device);
  5289. litest_drain_events(li);
  5290. /* double-tap with one finger too light */
  5291. litest_touch_down(dev, 0, 40, 50);
  5292. litest_touch_down_extended(dev, 1, 50, 50, axes);
  5293. litest_dispatch(li);
  5294. litest_touch_up(dev, 0);
  5295. litest_touch_up(dev, 1);
  5296. litest_dispatch(li);
  5297. event = libinput_get_event(li);
  5298. litest_is_button_event(event, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
  5299. libinput_event_destroy(event);
  5300. litest_timeout_tap(li);
  5301. event = libinput_get_event(li);
  5302. litest_is_button_event(event, BTN_LEFT, LIBINPUT_BUTTON_STATE_RELEASED);
  5303. libinput_event_destroy(event);
  5304. }
  5305. END_TEST
  5306. START_TEST(touchpad_pressure_btntool)
  5307. {
  5308. struct litest_device *dev = litest_current_device();
  5309. struct libinput *li = dev->libinput;
  5310. struct axis_replacement axes[] = {
  5311. { ABS_MT_PRESSURE, 5 },
  5312. { ABS_PRESSURE, 5 },
  5313. { -1, 0 },
  5314. };
  5315. /* we only have tripletap, can't test 4 slots because nothing will
  5316. * happen */
  5317. if (libevdev_get_num_slots(dev->evdev) != 2)
  5318. return LITEST_NOT_APPLICABLE;
  5319. if (!touchpad_has_pressure(dev))
  5320. return LITEST_NOT_APPLICABLE;
  5321. litest_enable_tap(dev->libinput_device);
  5322. litest_disable_hold_gestures(dev->libinput_device);
  5323. litest_drain_events(li);
  5324. /* Two light touches down, doesn't count */
  5325. litest_touch_down_extended(dev, 0, 40, 50, axes);
  5326. litest_touch_down_extended(dev, 1, 45, 50, axes);
  5327. litest_dispatch(li);
  5328. litest_assert_empty_queue(li);
  5329. /* Tripletap but since no finger is logically down, it doesn't count */
  5330. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  5331. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  5332. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  5333. litest_assert_empty_queue(li);
  5334. /* back to two fingers */
  5335. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  5336. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  5337. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  5338. litest_dispatch(li);
  5339. /* make one finger real */
  5340. litest_touch_move(dev, 0, 40, 50);
  5341. litest_drain_events(li);
  5342. /* tripletap should now be 3 fingers tap */
  5343. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
  5344. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 1);
  5345. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  5346. litest_dispatch(li);
  5347. litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
  5348. litest_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, 0);
  5349. litest_event(dev, EV_SYN, SYN_REPORT, 0);
  5350. litest_timeout_tap(li);
  5351. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_PRESSED);
  5352. litest_assert_button_event(li, BTN_MIDDLE, LIBINPUT_BUTTON_STATE_RELEASED);
  5353. }
  5354. END_TEST
  5355. START_TEST(touchpad_pressure_semi_mt_2fg_goes_light)
  5356. {
  5357. struct litest_device *dev = litest_current_device();
  5358. struct libinput *li = dev->libinput;
  5359. struct axis_replacement axes[] = {
  5360. { ABS_PRESSURE, 2 },
  5361. { -1, 0 },
  5362. };
  5363. litest_enable_2fg_scroll(dev);
  5364. litest_drain_events(li);
  5365. litest_touch_down(dev, 0, 40, 50);
  5366. litest_touch_down(dev, 1, 60, 50);
  5367. litest_touch_move_two_touches(dev, 40, 50, 60, 50, 0, -20, 10);
  5368. /* This should trigger a scroll end event */
  5369. litest_push_event_frame(dev);
  5370. litest_touch_move_extended(dev, 0, 40, 31, axes);
  5371. litest_touch_move_extended(dev, 1, 60, 31, axes);
  5372. litest_pop_event_frame(dev);
  5373. litest_dispatch(li);
  5374. litest_assert_scroll(li,
  5375. LIBINPUT_EVENT_POINTER_SCROLL_FINGER,
  5376. LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
  5377. 0);
  5378. litest_push_event_frame(dev);
  5379. litest_touch_move_extended(dev, 0, 40, 35, axes);
  5380. litest_touch_move_extended(dev, 1, 60, 35, axes);
  5381. litest_pop_event_frame(dev);
  5382. litest_push_event_frame(dev);
  5383. litest_touch_move_extended(dev, 0, 40, 40, axes);
  5384. litest_touch_move_extended(dev, 1, 60, 40, axes);
  5385. litest_pop_event_frame(dev);
  5386. litest_dispatch(li);
  5387. litest_assert_empty_queue(li);
  5388. }
  5389. END_TEST
  5390. START_TEST(touchpad_touch_size)
  5391. {
  5392. struct litest_device *dev = litest_current_device();
  5393. struct libinput *li = dev->libinput;
  5394. struct axis_replacement axes[] = {
  5395. { ABS_MT_TOUCH_MAJOR, 0 },
  5396. { ABS_MT_TOUCH_MINOR, 0 },
  5397. { ABS_MT_ORIENTATION, 0 },
  5398. { -1, 0 },
  5399. };
  5400. if (!touchpad_has_touch_size(dev))
  5401. return LITEST_NOT_APPLICABLE;
  5402. litest_drain_events(li);
  5403. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 1);
  5404. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 1);
  5405. litest_touch_down_extended(dev, 0, 50, 50, axes);
  5406. litest_touch_move_to_extended(dev, 0, 50, 50, 80, 80, axes, 10);
  5407. litest_touch_up(dev, 0);
  5408. litest_assert_empty_queue(li);
  5409. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 15);
  5410. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 15);
  5411. litest_touch_down_extended(dev, 0, 50, 50, axes);
  5412. litest_touch_move_to_extended(dev, 0, 50, 50, 80, 80, axes, 10);
  5413. litest_touch_up(dev, 0);
  5414. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5415. }
  5416. END_TEST
  5417. START_TEST(touchpad_touch_size_2fg)
  5418. {
  5419. struct litest_device *dev = litest_current_device();
  5420. struct libinput *li = dev->libinput;
  5421. struct axis_replacement axes[] = {
  5422. { ABS_MT_TOUCH_MAJOR, 0 },
  5423. { ABS_MT_TOUCH_MINOR, 0 },
  5424. { ABS_MT_ORIENTATION, 0 },
  5425. { -1, 0 },
  5426. };
  5427. if (!touchpad_has_touch_size(dev))
  5428. return LITEST_NOT_APPLICABLE;
  5429. litest_drain_events(li);
  5430. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 15);
  5431. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 15);
  5432. litest_touch_down_extended(dev, 0, 50, 50, axes);
  5433. litest_touch_move_to_extended(dev, 0, 50, 50, 80, 80, axes, 10);
  5434. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5435. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 1);
  5436. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 1);
  5437. litest_touch_down_extended(dev, 1, 70, 70, axes);
  5438. litest_touch_move_to_extended(dev, 1, 70, 70, 80, 90, axes, 10);
  5439. litest_assert_empty_queue(li);
  5440. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 15);
  5441. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 15);
  5442. litest_touch_move_to_extended(dev, 0, 80, 80, 50, 50, axes, 10);
  5443. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5444. litest_touch_up(dev, 1);
  5445. litest_touch_up(dev, 0);
  5446. }
  5447. END_TEST
  5448. START_TEST(touchpad_palm_detect_touch_size)
  5449. {
  5450. struct litest_device *dev = litest_current_device();
  5451. struct libinput *li = dev->libinput;
  5452. struct axis_replacement axes[] = {
  5453. { ABS_MT_TOUCH_MAJOR, 0 },
  5454. { ABS_MT_TOUCH_MINOR, 0 },
  5455. { -1, 0 },
  5456. };
  5457. if (!touchpad_has_touch_size(dev) || litest_touchpad_is_external(dev))
  5458. return LITEST_NOT_APPLICABLE;
  5459. litest_drain_events(li);
  5460. /* apply insufficient pressure */
  5461. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 30);
  5462. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 30);
  5463. litest_touch_down_extended(dev, 0, 50, 50, axes);
  5464. litest_touch_move_to_extended(dev, 0, 50, 50, 80, 80, axes, 10);
  5465. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5466. /* apply sufficient pressure */
  5467. litest_axis_set_value_unchecked(axes, ABS_MT_TOUCH_MAJOR, 90);
  5468. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 90);
  5469. litest_touch_move_to_extended(dev, 0, 80, 80, 50, 50, axes, 10);
  5470. litest_assert_empty_queue(li);
  5471. }
  5472. END_TEST
  5473. START_TEST(touchpad_palm_detect_touch_size_late)
  5474. {
  5475. struct litest_device *dev = litest_current_device();
  5476. struct libinput *li = dev->libinput;
  5477. struct axis_replacement axes[] = {
  5478. { ABS_MT_TOUCH_MAJOR, 0 },
  5479. { ABS_MT_TOUCH_MINOR, 0 },
  5480. { -1, 0 },
  5481. };
  5482. if (!touchpad_has_touch_size(dev) || litest_touchpad_is_external(dev))
  5483. return LITEST_NOT_APPLICABLE;
  5484. litest_drain_events(li);
  5485. /* apply insufficient pressure */
  5486. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 30);
  5487. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 30);
  5488. litest_touch_down(dev, 0, 50, 50);
  5489. litest_touch_move_to(dev, 0, 50, 70, 80, 90, 10);
  5490. litest_drain_events(li);
  5491. litest_dispatch(li);
  5492. litest_touch_move_to_extended(dev, 0, 80, 90, 50, 20, axes, 10);
  5493. litest_touch_up(dev, 0);
  5494. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5495. /* apply sufficient pressure */
  5496. litest_axis_set_value_unchecked(axes, ABS_MT_TOUCH_MAJOR, 90);
  5497. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 90);
  5498. litest_touch_down(dev, 0, 50, 50);
  5499. litest_touch_move_to(dev, 0, 50, 70, 80, 90, 10);
  5500. litest_drain_events(li);
  5501. litest_dispatch(li);
  5502. litest_touch_move_to_extended(dev, 0, 80, 90, 50, 20, axes, 10);
  5503. litest_touch_up(dev, 0);
  5504. litest_assert_empty_queue(li);
  5505. }
  5506. END_TEST
  5507. START_TEST(touchpad_palm_detect_touch_size_keep_palm)
  5508. {
  5509. struct litest_device *dev = litest_current_device();
  5510. struct libinput *li = dev->libinput;
  5511. struct axis_replacement axes[] = {
  5512. { ABS_MT_TOUCH_MAJOR, 0 },
  5513. { ABS_MT_TOUCH_MINOR, 0 },
  5514. { -1, 0 },
  5515. };
  5516. if (!touchpad_has_touch_size(dev) || litest_touchpad_is_external(dev))
  5517. return LITEST_NOT_APPLICABLE;
  5518. litest_drain_events(li);
  5519. /* apply insufficient pressure */
  5520. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 30);
  5521. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 30);
  5522. litest_touch_down(dev, 0, 80, 90);
  5523. litest_touch_move_to_extended(dev, 0, 80, 90, 50, 20, axes, 10);
  5524. litest_touch_move_to(dev, 0, 50, 20, 80, 90, 10);
  5525. litest_touch_up(dev, 0);
  5526. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5527. /* apply sufficient pressure */
  5528. litest_axis_set_value_unchecked(axes, ABS_MT_TOUCH_MAJOR, 90);
  5529. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 90);
  5530. litest_touch_down(dev, 0, 80, 90);
  5531. litest_touch_move_to_extended(dev, 0, 80, 90, 50, 20, axes, 10);
  5532. litest_touch_move_to(dev, 0, 50, 20, 80, 90, 10);
  5533. litest_touch_up(dev, 0);
  5534. litest_assert_empty_queue(li);
  5535. }
  5536. END_TEST
  5537. START_TEST(touchpad_palm_detect_touch_size_after_edge)
  5538. {
  5539. struct litest_device *dev = litest_current_device();
  5540. struct libinput *li = dev->libinput;
  5541. struct axis_replacement axes[] = {
  5542. { ABS_MT_TOUCH_MAJOR, 0 },
  5543. { ABS_MT_TOUCH_MINOR, 0 },
  5544. { -1, 0 },
  5545. };
  5546. if (!touchpad_has_touch_size(dev) || litest_touchpad_is_external(dev) ||
  5547. !litest_has_palm_detect_size(dev) || !litest_has_2fg_scroll(dev))
  5548. return LITEST_NOT_APPLICABLE;
  5549. litest_enable_2fg_scroll(dev);
  5550. litest_drain_events(li);
  5551. /* apply sufficient pressure */
  5552. litest_axis_set_value_unchecked(axes, ABS_MT_TOUCH_MAJOR, 90);
  5553. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 90);
  5554. litest_touch_down(dev, 0, 99, 50);
  5555. litest_touch_move_to_extended(dev, 0, 99, 50, 20, 50, axes, 20);
  5556. litest_touch_up(dev, 0);
  5557. litest_dispatch(li);
  5558. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5559. }
  5560. END_TEST
  5561. START_TEST(touchpad_palm_detect_touch_size_after_dwt)
  5562. {
  5563. struct litest_device *touchpad = litest_current_device();
  5564. struct litest_device *keyboard;
  5565. struct libinput *li = touchpad->libinput;
  5566. struct axis_replacement axes[] = {
  5567. { ABS_MT_TOUCH_MAJOR, 0 },
  5568. { ABS_MT_TOUCH_MINOR, 0 },
  5569. { -1, 0 },
  5570. };
  5571. if (!touchpad_has_touch_size(touchpad) || litest_touchpad_is_external(touchpad))
  5572. return LITEST_NOT_APPLICABLE;
  5573. keyboard = dwt_init_paired_keyboard(li, touchpad);
  5574. litest_drain_events(li);
  5575. litest_keyboard_key(keyboard, KEY_A, true);
  5576. litest_keyboard_key(keyboard, KEY_A, false);
  5577. litest_drain_events(li);
  5578. /* apply sufficient pressure */
  5579. litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, 90);
  5580. litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, 90);
  5581. /* within dwt timeout, dwt blocks events */
  5582. litest_touch_down(touchpad, 0, 50, 50);
  5583. litest_touch_move_to_extended(touchpad, 0, 50, 50, 20, 50, axes, 20);
  5584. litest_assert_empty_queue(li);
  5585. litest_timeout_dwt_short(li);
  5586. litest_dispatch(li);
  5587. litest_assert_empty_queue(li);
  5588. /* after dwt timeout, pressure blocks events */
  5589. litest_touch_move_to_extended(touchpad, 0, 20, 50, 50, 50, axes, 20);
  5590. litest_touch_up(touchpad, 0);
  5591. litest_assert_empty_queue(li);
  5592. litest_device_destroy(keyboard);
  5593. }
  5594. END_TEST
  5595. START_TEST(touchpad_speed_ignore_finger)
  5596. {
  5597. struct litest_device *dev = litest_current_device();
  5598. struct libinput *li = dev->libinput;
  5599. if (!has_thumb_detect(dev))
  5600. return LITEST_NOT_APPLICABLE;
  5601. if (litest_has_clickfinger(dev))
  5602. litest_enable_clickfinger(dev);
  5603. litest_drain_events(li);
  5604. litest_touch_down(dev, 0, 20, 20);
  5605. litest_touch_move_to(dev, 0, 20, 20, 85, 80, 20);
  5606. litest_touch_down(dev, 1, 20, 80);
  5607. litest_touch_move_two_touches(dev, 85, 80, 20, 80, -20, -20, 10);
  5608. litest_dispatch(li);
  5609. litest_touch_up(dev, 0);
  5610. litest_touch_up(dev, 1);
  5611. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5612. }
  5613. END_TEST
  5614. START_TEST(touchpad_speed_allow_nearby_finger)
  5615. {
  5616. struct litest_device *dev = litest_current_device();
  5617. struct libinput *li = dev->libinput;
  5618. if (!has_thumb_detect(dev))
  5619. return LITEST_NOT_APPLICABLE;
  5620. if (!litest_has_2fg_scroll(dev))
  5621. return LITEST_NOT_APPLICABLE;
  5622. if (litest_has_clickfinger(dev))
  5623. litest_enable_clickfinger(dev);
  5624. litest_enable_2fg_scroll(dev);
  5625. litest_drain_events(li);
  5626. litest_touch_down(dev, 0, 20, 20);
  5627. litest_touch_move_to(dev, 0, 20, 20, 80, 80, 20);
  5628. litest_drain_events(li);
  5629. litest_touch_down(dev, 1, 79, 80);
  5630. litest_touch_move_two_touches(dev, 80, 80, 79, 80, -20, -20, 10);
  5631. litest_dispatch(li);
  5632. litest_touch_up(dev, 0);
  5633. litest_touch_up(dev, 1);
  5634. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  5635. }
  5636. END_TEST
  5637. START_TEST(touchpad_speed_ignore_finger_edgescroll)
  5638. {
  5639. struct litest_device *dev = litest_current_device();
  5640. struct libinput *li = dev->libinput;
  5641. if (!has_thumb_detect(dev))
  5642. return LITEST_NOT_APPLICABLE;
  5643. litest_enable_edge_scroll(dev);
  5644. if (litest_has_clickfinger(dev))
  5645. litest_enable_clickfinger(dev);
  5646. litest_drain_events(li);
  5647. litest_touch_down(dev, 0, 20, 20);
  5648. litest_touch_move_to(dev, 0, 20, 20, 60, 80, 20);
  5649. litest_drain_events(li);
  5650. litest_touch_down(dev, 1, 59, 80);
  5651. litest_touch_move_two_touches(dev, 60, 80, 59, 80, -20, -20, 10);
  5652. litest_dispatch(li);
  5653. litest_touch_up(dev, 0);
  5654. litest_dispatch(li);
  5655. litest_touch_up(dev, 1);
  5656. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5657. }
  5658. END_TEST
  5659. START_TEST(touchpad_speed_ignore_hovering_finger)
  5660. {
  5661. struct litest_device *dev = litest_current_device();
  5662. struct libinput *li = dev->libinput;
  5663. struct axis_replacement axes[] = {
  5664. { ABS_MT_TOUCH_MAJOR, 1 },
  5665. { ABS_MT_TOUCH_MINOR, 1 },
  5666. { -1, 0 },
  5667. };
  5668. if (!has_thumb_detect(dev))
  5669. return LITEST_NOT_APPLICABLE;
  5670. litest_drain_events(li);
  5671. /* first finger down but below touch size. we use slot 2 because
  5672. * it's easier this way for litest */
  5673. litest_touch_down_extended(dev, 2, 20, 20, axes);
  5674. litest_touch_move_to_extended(dev, 2, 20, 20, 60, 80, axes, 20);
  5675. litest_drain_events(li);
  5676. /* second, third finger down withn same frame */
  5677. litest_push_event_frame(dev);
  5678. litest_touch_down(dev, 0, 59, 70);
  5679. litest_touch_down(dev, 1, 65, 70);
  5680. litest_pop_event_frame(dev);
  5681. litest_touch_move_two_touches(dev, 59, 70, 65, 70, 0, 30, 10);
  5682. litest_dispatch(li);
  5683. litest_touch_up(dev, 2);
  5684. litest_dispatch(li);
  5685. litest_touch_up(dev, 1);
  5686. litest_touch_up(dev, 0);
  5687. litest_assert_only_axis_events(li, LIBINPUT_EVENT_POINTER_SCROLL_FINGER);
  5688. }
  5689. END_TEST
  5690. enum suspend {
  5691. SUSPEND_EXT_MOUSE = 1,
  5692. SUSPEND_SENDEVENTS,
  5693. SUSPEND_LID,
  5694. SUSPEND_TABLETMODE,
  5695. SUSPEND_COUNT,
  5696. };
  5697. static void
  5698. assert_touchpad_moves(struct litest_device *tp)
  5699. {
  5700. struct libinput *li = tp->libinput;
  5701. litest_touch_down(tp, 0, 50, 50);
  5702. litest_touch_move_to(tp, 0, 50, 50, 60, 80, 20);
  5703. litest_touch_up(tp, 0);
  5704. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5705. }
  5706. static void
  5707. assert_touchpad_does_not_move(struct litest_device *tp)
  5708. {
  5709. struct libinput *li = tp->libinput;
  5710. litest_touch_down(tp, 0, 20, 20);
  5711. litest_touch_move_to(tp, 0, 20, 20, 60, 80, 20);
  5712. litest_touch_up(tp, 0);
  5713. litest_assert_empty_queue(li);
  5714. }
  5715. START_TEST(touchpad_suspend_abba)
  5716. {
  5717. struct litest_device *tp = litest_current_device();
  5718. struct litest_device *lid, *tabletmode, *extmouse;
  5719. struct libinput *li = tp->libinput;
  5720. enum suspend first = litest_test_param_get_i32(test_env->params, "mode");
  5721. if (first == SUSPEND_EXT_MOUSE && litest_touchpad_is_external(tp))
  5722. return LITEST_NOT_APPLICABLE;
  5723. lid = litest_add_device(li, LITEST_LID_SWITCH);
  5724. tabletmode = litest_add_device(li, LITEST_THINKPAD_EXTRABUTTONS);
  5725. extmouse = litest_add_device(li, LITEST_MOUSE);
  5726. litest_grab_device(lid);
  5727. litest_grab_device(tabletmode);
  5728. litest_disable_tap(tp->libinput_device);
  5729. litest_disable_hold_gestures(tp->libinput_device);
  5730. /* ABBA test for touchpad internal suspend:
  5731. * reason A on
  5732. * reason B on
  5733. * reason B off
  5734. * reason A off
  5735. */
  5736. for (enum suspend other = SUSPEND_EXT_MOUSE; other < SUSPEND_COUNT; other++) {
  5737. if (other == first)
  5738. continue;
  5739. if (other == SUSPEND_EXT_MOUSE && litest_touchpad_is_external(tp))
  5740. goto out;
  5741. /* That transition is tested elsewhere and has a different
  5742. * behavior */
  5743. if ((other == SUSPEND_SENDEVENTS && first == SUSPEND_EXT_MOUSE) ||
  5744. (first == SUSPEND_SENDEVENTS && other == SUSPEND_EXT_MOUSE))
  5745. continue;
  5746. litest_drain_events(li);
  5747. assert_touchpad_moves(tp);
  5748. /* First reason for suspend: on */
  5749. switch (first) {
  5750. case SUSPEND_EXT_MOUSE:
  5751. litest_sendevents_ext_mouse(tp);
  5752. break;
  5753. case SUSPEND_TABLETMODE:
  5754. litest_switch_action(tabletmode,
  5755. LIBINPUT_SWITCH_TABLET_MODE,
  5756. LIBINPUT_SWITCH_STATE_ON);
  5757. break;
  5758. case SUSPEND_LID:
  5759. litest_switch_action(lid,
  5760. LIBINPUT_SWITCH_LID,
  5761. LIBINPUT_SWITCH_STATE_ON);
  5762. break;
  5763. case SUSPEND_SENDEVENTS:
  5764. litest_sendevents_off(tp);
  5765. break;
  5766. default:
  5767. litest_abort_msg("Unexpected suspend option");
  5768. }
  5769. litest_drain_events(li);
  5770. assert_touchpad_does_not_move(tp);
  5771. /* Second reason to suspend: on/off while first reason remains */
  5772. switch (other) {
  5773. case SUSPEND_EXT_MOUSE:
  5774. litest_sendevents_ext_mouse(tp);
  5775. litest_sendevents_on(tp);
  5776. break;
  5777. case SUSPEND_LID:
  5778. litest_switch_action(lid,
  5779. LIBINPUT_SWITCH_LID,
  5780. LIBINPUT_SWITCH_STATE_ON);
  5781. litest_drain_events(li);
  5782. litest_switch_action(lid,
  5783. LIBINPUT_SWITCH_LID,
  5784. LIBINPUT_SWITCH_STATE_OFF);
  5785. litest_drain_events(li);
  5786. break;
  5787. case SUSPEND_TABLETMODE:
  5788. litest_switch_action(tabletmode,
  5789. LIBINPUT_SWITCH_TABLET_MODE,
  5790. LIBINPUT_SWITCH_STATE_ON);
  5791. litest_drain_events(li);
  5792. litest_switch_action(tabletmode,
  5793. LIBINPUT_SWITCH_TABLET_MODE,
  5794. LIBINPUT_SWITCH_STATE_OFF);
  5795. litest_drain_events(li);
  5796. break;
  5797. case SUSPEND_SENDEVENTS:
  5798. litest_sendevents_off(tp);
  5799. litest_sendevents_on(tp);
  5800. break;
  5801. default:
  5802. litest_abort_msg("Unexpected suspend option");
  5803. }
  5804. assert_touchpad_does_not_move(tp);
  5805. /* First reason for suspend: off */
  5806. switch (first) {
  5807. case SUSPEND_EXT_MOUSE:
  5808. litest_sendevents_on(tp);
  5809. break;
  5810. case SUSPEND_TABLETMODE:
  5811. litest_switch_action(tabletmode,
  5812. LIBINPUT_SWITCH_TABLET_MODE,
  5813. LIBINPUT_SWITCH_STATE_OFF);
  5814. break;
  5815. case SUSPEND_LID:
  5816. litest_switch_action(lid,
  5817. LIBINPUT_SWITCH_LID,
  5818. LIBINPUT_SWITCH_STATE_OFF);
  5819. break;
  5820. case SUSPEND_SENDEVENTS:
  5821. litest_sendevents_on(tp);
  5822. break;
  5823. default:
  5824. litest_abort_msg("Unexpected suspend option");
  5825. }
  5826. litest_drain_events(li);
  5827. assert_touchpad_moves(tp);
  5828. }
  5829. out:
  5830. litest_ungrab_device(lid);
  5831. litest_ungrab_device(tabletmode);
  5832. litest_device_destroy(lid);
  5833. litest_device_destroy(tabletmode);
  5834. litest_device_destroy(extmouse);
  5835. }
  5836. END_TEST
  5837. START_TEST(touchpad_suspend_abab)
  5838. {
  5839. struct litest_device *tp = litest_current_device();
  5840. struct litest_device *lid, *tabletmode, *extmouse;
  5841. struct libinput *li = tp->libinput;
  5842. enum suspend first = litest_test_param_get_i32(test_env->params, "mode");
  5843. if (first == SUSPEND_EXT_MOUSE && litest_touchpad_is_external(tp))
  5844. return LITEST_NOT_APPLICABLE;
  5845. lid = litest_add_device(li, LITEST_LID_SWITCH);
  5846. tabletmode = litest_add_device(li, LITEST_THINKPAD_EXTRABUTTONS);
  5847. extmouse = litest_add_device(li, LITEST_MOUSE);
  5848. litest_grab_device(lid);
  5849. litest_grab_device(tabletmode);
  5850. litest_disable_tap(tp->libinput_device);
  5851. litest_disable_hold_gestures(tp->libinput_device);
  5852. /* ABAB test for touchpad internal suspend:
  5853. * reason A on
  5854. * reason B on
  5855. * reason A off
  5856. * reason B off
  5857. */
  5858. for (enum suspend other = SUSPEND_EXT_MOUSE; other < SUSPEND_COUNT; other++) {
  5859. if (other == first)
  5860. continue;
  5861. if (other == SUSPEND_EXT_MOUSE && litest_touchpad_is_external(tp))
  5862. goto out;
  5863. /* That transition is tested elsewhere and has a different
  5864. * behavior */
  5865. if ((other == SUSPEND_SENDEVENTS && first == SUSPEND_EXT_MOUSE) ||
  5866. (first == SUSPEND_SENDEVENTS && other == SUSPEND_EXT_MOUSE))
  5867. continue;
  5868. litest_drain_events(li);
  5869. assert_touchpad_moves(tp);
  5870. /* First reason for suspend: on */
  5871. switch (first) {
  5872. case SUSPEND_EXT_MOUSE:
  5873. litest_sendevents_ext_mouse(tp);
  5874. break;
  5875. case SUSPEND_TABLETMODE:
  5876. litest_switch_action(tabletmode,
  5877. LIBINPUT_SWITCH_TABLET_MODE,
  5878. LIBINPUT_SWITCH_STATE_ON);
  5879. break;
  5880. case SUSPEND_LID:
  5881. litest_switch_action(lid,
  5882. LIBINPUT_SWITCH_LID,
  5883. LIBINPUT_SWITCH_STATE_ON);
  5884. break;
  5885. case SUSPEND_SENDEVENTS:
  5886. litest_sendevents_off(tp);
  5887. break;
  5888. default:
  5889. litest_abort_msg("Unexpected suspend option");
  5890. }
  5891. litest_drain_events(li);
  5892. assert_touchpad_does_not_move(tp);
  5893. /* Second reason to suspend: on */
  5894. switch (other) {
  5895. case SUSPEND_EXT_MOUSE:
  5896. litest_sendevents_ext_mouse(tp);
  5897. break;
  5898. case SUSPEND_LID:
  5899. litest_switch_action(lid,
  5900. LIBINPUT_SWITCH_LID,
  5901. LIBINPUT_SWITCH_STATE_ON);
  5902. litest_drain_events(li);
  5903. break;
  5904. case SUSPEND_TABLETMODE:
  5905. litest_switch_action(tabletmode,
  5906. LIBINPUT_SWITCH_TABLET_MODE,
  5907. LIBINPUT_SWITCH_STATE_ON);
  5908. litest_drain_events(li);
  5909. break;
  5910. case SUSPEND_SENDEVENTS:
  5911. litest_sendevents_off(tp);
  5912. break;
  5913. default:
  5914. litest_abort_msg("Unexpected suspend option");
  5915. }
  5916. assert_touchpad_does_not_move(tp);
  5917. /* First reason for suspend: off */
  5918. switch (first) {
  5919. case SUSPEND_EXT_MOUSE:
  5920. litest_sendevents_on(tp);
  5921. break;
  5922. case SUSPEND_TABLETMODE:
  5923. litest_switch_action(tabletmode,
  5924. LIBINPUT_SWITCH_TABLET_MODE,
  5925. LIBINPUT_SWITCH_STATE_OFF);
  5926. break;
  5927. case SUSPEND_LID:
  5928. litest_switch_action(lid,
  5929. LIBINPUT_SWITCH_LID,
  5930. LIBINPUT_SWITCH_STATE_OFF);
  5931. break;
  5932. case SUSPEND_SENDEVENTS:
  5933. litest_sendevents_on(tp);
  5934. break;
  5935. default:
  5936. litest_abort_msg("Unexpected suspend option");
  5937. }
  5938. litest_drain_events(li);
  5939. assert_touchpad_does_not_move(tp);
  5940. /* Second reason to suspend: off */
  5941. switch (other) {
  5942. case SUSPEND_EXT_MOUSE:
  5943. litest_sendevents_on(tp);
  5944. break;
  5945. case SUSPEND_LID:
  5946. litest_switch_action(lid,
  5947. LIBINPUT_SWITCH_LID,
  5948. LIBINPUT_SWITCH_STATE_OFF);
  5949. litest_drain_events(li);
  5950. break;
  5951. case SUSPEND_TABLETMODE:
  5952. litest_switch_action(tabletmode,
  5953. LIBINPUT_SWITCH_TABLET_MODE,
  5954. LIBINPUT_SWITCH_STATE_OFF);
  5955. litest_drain_events(li);
  5956. break;
  5957. case SUSPEND_SENDEVENTS:
  5958. litest_sendevents_on(tp);
  5959. break;
  5960. default:
  5961. litest_abort_msg("Unexpected suspend option");
  5962. }
  5963. litest_drain_events(li);
  5964. assert_touchpad_moves(tp);
  5965. }
  5966. out:
  5967. litest_ungrab_device(lid);
  5968. litest_ungrab_device(tabletmode);
  5969. litest_device_destroy(lid);
  5970. litest_device_destroy(tabletmode);
  5971. litest_device_destroy(extmouse);
  5972. }
  5973. END_TEST
  5974. START_TEST(touchpad_end_start_touch)
  5975. {
  5976. struct litest_device *dev = litest_current_device();
  5977. struct libinput *li = dev->libinput;
  5978. litest_enable_tap(dev->libinput_device);
  5979. litest_disable_hold_gestures(dev->libinput_device);
  5980. litest_drain_events(li);
  5981. litest_touch_down(dev, 0, 50, 50);
  5982. litest_touch_move(dev, 0, 50.1, 50.1);
  5983. litest_dispatch(li);
  5984. litest_push_event_frame(dev);
  5985. litest_touch_up(dev, 0);
  5986. litest_touch_down(dev, 0, 50.2, 50.2);
  5987. litest_pop_event_frame(dev);
  5988. litest_disable_log_handler(li);
  5989. litest_dispatch(li);
  5990. litest_restore_log_handler(li);
  5991. litest_assert_empty_queue(li);
  5992. litest_timeout_tap(li);
  5993. litest_touch_move_to(dev, 0, 50.2, 50.2, 50, 70, 10);
  5994. litest_touch_up(dev, 0);
  5995. litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
  5996. }
  5997. END_TEST
  5998. START_TEST(touchpad_fuzz)
  5999. {
  6000. struct litest_device *dev = litest_current_device();
  6001. struct libevdev *evdev = dev->evdev;
  6002. /* We expect our udev callout to always set this to 0 */
  6003. litest_assert_int_eq(libevdev_get_abs_fuzz(evdev, ABS_X), 0);
  6004. litest_assert_int_eq(libevdev_get_abs_fuzz(evdev, ABS_Y), 0);
  6005. if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_X))
  6006. litest_assert_int_eq(libevdev_get_abs_fuzz(evdev, ABS_MT_POSITION_X),
  6007. 0);
  6008. if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_Y))
  6009. litest_assert_int_eq(libevdev_get_abs_fuzz(evdev, ABS_MT_POSITION_Y),
  6010. 0);
  6011. }
  6012. END_TEST
  6013. TEST_COLLECTION(touchpad)
  6014. {
  6015. /* clang-format off */
  6016. litest_add(touchpad_1fg_motion, LITEST_TOUCHPAD, LITEST_ANY);
  6017. litest_add(touchpad_2fg_no_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6018. litest_add(touchpad_2fg_scroll, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
  6019. litest_add(touchpad_2fg_scroll_initially_diagonal, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
  6020. litest_add(touchpad_2fg_scroll_axis_lock, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
  6021. litest_add(touchpad_2fg_scroll_axis_lock_switch, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
  6022. litest_add(touchpad_2fg_scroll_slow_distance, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6023. litest_add(touchpad_2fg_scroll_return_to_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6024. litest_add(touchpad_2fg_scroll_source, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6025. litest_add(touchpad_2fg_scroll_semi_mt, LITEST_SEMI_MT, LITEST_SINGLE_TOUCH);
  6026. litest_add(touchpad_2fg_scroll_from_btnareas, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6027. litest_add(touchpad_scroll_natural_defaults, LITEST_TOUCHPAD, LITEST_ANY);
  6028. litest_add(touchpad_scroll_natural_enable_config, LITEST_TOUCHPAD, LITEST_ANY);
  6029. litest_add(touchpad_scroll_natural_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6030. litest_add(touchpad_scroll_natural_edge, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6031. litest_add(touchpad_scroll_defaults, LITEST_TOUCHPAD, LITEST_ANY);
  6032. litest_add(touchpad_edge_scroll_vert, LITEST_TOUCHPAD, LITEST_ANY);
  6033. litest_add(touchpad_edge_scroll_horiz, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  6034. litest_add(touchpad_edge_scroll_horiz_clickpad, LITEST_CLICKPAD, LITEST_ANY);
  6035. litest_add(touchpad_edge_scroll_no_horiz, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  6036. litest_add(touchpad_edge_scroll_no_motion, LITEST_TOUCHPAD, LITEST_ANY);
  6037. litest_add(touchpad_edge_scroll_no_edge_after_motion, LITEST_TOUCHPAD, LITEST_ANY);
  6038. litest_add(touchpad_edge_scroll_timeout, LITEST_TOUCHPAD, LITEST_ANY);
  6039. litest_add(touchpad_edge_scroll_source, LITEST_TOUCHPAD, LITEST_ANY);
  6040. litest_add(touchpad_edge_scroll_no_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6041. litest_add(touchpad_edge_scroll_into_buttonareas, LITEST_CLICKPAD, LITEST_ANY);
  6042. litest_add(touchpad_edge_scroll_within_buttonareas, LITEST_CLICKPAD, LITEST_ANY);
  6043. litest_add(touchpad_edge_scroll_buttonareas_click_stops_scroll, LITEST_CLICKPAD, LITEST_ANY);
  6044. litest_add(touchpad_edge_scroll_clickfinger_click_stops_scroll, LITEST_CLICKPAD, LITEST_ANY);
  6045. litest_add(touchpad_edge_scroll_into_area, LITEST_TOUCHPAD, LITEST_ANY);
  6046. litest_add(touchpad_left_handed, LITEST_TOUCHPAD|LITEST_BUTTON, LITEST_CLICKPAD);
  6047. litest_add_for_device(touchpad_left_handed_appletouch, LITEST_APPLETOUCH);
  6048. litest_add(touchpad_left_handed_clickpad, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  6049. litest_add(touchpad_left_handed_clickfinger, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6050. litest_add(touchpad_left_handed_tapping, LITEST_TOUCHPAD, LITEST_ANY);
  6051. litest_add(touchpad_left_handed_tapping_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6052. litest_add(touchpad_left_handed_delayed, LITEST_TOUCHPAD|LITEST_BUTTON, LITEST_CLICKPAD);
  6053. litest_add(touchpad_left_handed_clickpad_delayed, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
  6054. litest_add(touchpad_left_handed_rotation, LITEST_TOUCHPAD, LITEST_ANY);
  6055. /* Semi-MT hover tests aren't generic, they only work on this device and
  6056. * ignore the semi-mt capability (it doesn't matter for the tests) */
  6057. litest_add_for_device(touchpad_semi_mt_hover_noevent, LITEST_SYNAPTICS_HOVER_SEMI_MT);
  6058. litest_add_for_device(touchpad_semi_mt_hover_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
  6059. litest_add_for_device(touchpad_semi_mt_hover_down_up, LITEST_SYNAPTICS_HOVER_SEMI_MT);
  6060. litest_add_for_device(touchpad_semi_mt_hover_down_hover_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
  6061. litest_add_for_device(touchpad_semi_mt_hover_2fg_noevent, LITEST_SYNAPTICS_HOVER_SEMI_MT);
  6062. litest_add_for_device(touchpad_semi_mt_hover_2fg_1fg_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
  6063. litest_add_for_device(touchpad_semi_mt_hover_2fg_up, LITEST_SYNAPTICS_HOVER_SEMI_MT);
  6064. litest_add(touchpad_hover_noevent, LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
  6065. litest_add(touchpad_hover_down, LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
  6066. litest_add(touchpad_hover_down_up, LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
  6067. litest_add(touchpad_hover_down_hover_down, LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
  6068. litest_add(touchpad_hover_2fg_noevent, LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
  6069. litest_add(touchpad_hover_2fg_1fg_down, LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
  6070. litest_add(touchpad_hover_1fg_tap, LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
  6071. litest_add_for_device(touchpad_trackpoint_buttons, LITEST_SYNAPTICS_TRACKPOINT_BUTTONS);
  6072. litest_add_for_device(touchpad_trackpoint_mb_scroll, LITEST_SYNAPTICS_TRACKPOINT_BUTTONS);
  6073. litest_add_for_device(touchpad_trackpoint_mb_click, LITEST_SYNAPTICS_TRACKPOINT_BUTTONS);
  6074. litest_add_for_device(touchpad_trackpoint_buttons_softbuttons, LITEST_SYNAPTICS_TRACKPOINT_BUTTONS);
  6075. litest_add_for_device(touchpad_trackpoint_buttons_2fg_scroll, LITEST_SYNAPTICS_TRACKPOINT_BUTTONS);
  6076. litest_add_for_device(touchpad_trackpoint_no_trackpoint, LITEST_SYNAPTICS_TRACKPOINT_BUTTONS);
  6077. litest_with_parameters(params, "axis", 'I', 2, litest_named_i32(ABS_X), litest_named_i32(ABS_Y)) {
  6078. litest_add_parametrized(touchpad_initial_state, LITEST_TOUCHPAD, LITEST_ANY, params);
  6079. }
  6080. litest_with_parameters(params, "fingers", 'i', 5, 1, 2, 3, 4, 5) {
  6081. litest_add_parametrized(touchpad_fingers_down_before_init, LITEST_TOUCHPAD, LITEST_ANY, params);
  6082. }
  6083. litest_add(touchpad_state_after_syn_dropped_2fg_change, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6084. litest_add(touchpad_thumb_lower_area_movement, LITEST_CLICKPAD, LITEST_ANY);
  6085. litest_add(touchpad_thumb_lower_area_movement_rethumb, LITEST_CLICKPAD, LITEST_ANY);
  6086. litest_add(touchpad_thumb_speed_empty_slots, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6087. litest_add(touchpad_thumb_area_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
  6088. litest_add(touchpad_thumb_area_btnarea, LITEST_CLICKPAD, LITEST_ANY);
  6089. litest_add(touchpad_thumb_no_doublethumb, LITEST_CLICKPAD, LITEST_ANY);
  6090. litest_add_for_device(touchpad_tool_tripletap_touch_count, LITEST_SYNAPTICS_TOPBUTTONPAD);
  6091. litest_add_for_device(touchpad_tool_tripletap_touch_count_late, LITEST_SYNAPTICS_TOPBUTTONPAD);
  6092. litest_add_for_device(touchpad_slot_swap, LITEST_SYNAPTICS_TOPBUTTONPAD);
  6093. litest_add_for_device(touchpad_finger_always_down, LITEST_SYNAPTICS_TOPBUTTONPAD);
  6094. litest_add(touchpad_time_usec, LITEST_TOUCHPAD, LITEST_ANY);
  6095. litest_add_for_device(touchpad_jump_finger_motion, LITEST_SYNAPTICS_CLICKPAD_X220);
  6096. litest_add_for_device(touchpad_jump_delta, LITEST_SYNAPTICS_CLICKPAD_X220);
  6097. litest_with_parameters(params, "suspend", 'b') {
  6098. litest_add_parametrized_for_device(touchpad_disabled_on_mouse, LITEST_SYNAPTICS_CLICKPAD_X220, params);
  6099. }
  6100. litest_with_parameters(params,
  6101. "suspend-nonsending", 'b',
  6102. "remove", 'I', 2, litest_named_i32(2, "sending-mouse"),
  6103. litest_named_i32(1, "nonsending-mouse")) {
  6104. litest_add_parametrized_for_device(touchpad_disabled_double_mouse, LITEST_SYNAPTICS_CLICKPAD_X220, params);
  6105. }
  6106. litest_add(touchpad_pressure, LITEST_TOUCHPAD, LITEST_ANY);
  6107. litest_add(touchpad_pressure_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6108. litest_add(touchpad_pressure_2fg_st, LITEST_TOUCHPAD|LITEST_SINGLE_TOUCH, LITEST_ANY);
  6109. litest_add(touchpad_pressure_tap, LITEST_TOUCHPAD, LITEST_ANY);
  6110. litest_add(touchpad_pressure_tap_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6111. litest_add(touchpad_pressure_tap_2fg_1fg_light, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6112. litest_add(touchpad_pressure_btntool, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6113. litest_add(touchpad_pressure_semi_mt_2fg_goes_light, LITEST_SEMI_MT, LITEST_ANY);
  6114. litest_add(touchpad_touch_size, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6115. litest_add(touchpad_touch_size_2fg, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6116. litest_add(touchpad_speed_ignore_finger, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
  6117. litest_add(touchpad_speed_allow_nearby_finger, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
  6118. litest_add(touchpad_speed_ignore_finger_edgescroll, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
  6119. litest_add_for_device(touchpad_speed_ignore_hovering_finger, LITEST_BCM5974);
  6120. litest_with_parameters(params, "mode", 'I', 4, litest_named_i32(SUSPEND_EXT_MOUSE, "external_mouse"),
  6121. litest_named_i32(SUSPEND_SENDEVENTS, "sendevents"),
  6122. litest_named_i32(SUSPEND_LID, "lid"),
  6123. litest_named_i32(SUSPEND_TABLETMODE, "tabletmode")) {
  6124. litest_add_parametrized(touchpad_suspend_abba, LITEST_TOUCHPAD, LITEST_ANY, params);
  6125. litest_add_parametrized(touchpad_suspend_abab, LITEST_TOUCHPAD, LITEST_ANY, params);
  6126. }
  6127. /* Happens on the "Wacom Intuos Pro M Finger" but our test device
  6128. * has the same properties */
  6129. litest_add_for_device(touchpad_end_start_touch, LITEST_WACOM_INTUOS5_FINGER);
  6130. litest_add(touchpad_fuzz, LITEST_TOUCHPAD, LITEST_ANY);
  6131. /* clang-format on */
  6132. }
  6133. TEST_COLLECTION(touchpad_dwt)
  6134. {
  6135. /* clang-format off */
  6136. litest_add(touchpad_dwt_single_key, LITEST_TOUCHPAD, LITEST_ANY);
  6137. litest_add_for_device(touchpad_dwt_ext_and_int_keyboard, LITEST_SYNAPTICS_I2C);
  6138. litest_add(touchpad_dwt_enable_touch, LITEST_TOUCHPAD, LITEST_ANY);
  6139. litest_add(touchpad_dwt_touch_hold, LITEST_TOUCHPAD, LITEST_ANY);
  6140. litest_add(touchpad_dwt_key_hold, LITEST_TOUCHPAD, LITEST_ANY);
  6141. litest_add(touchpad_dwt_key_hold_timeout, LITEST_TOUCHPAD, LITEST_ANY);
  6142. litest_add(touchpad_dwt_key_hold_timeout_existing_touch, LITEST_TOUCHPAD, LITEST_ANY);
  6143. litest_add(touchpad_dwt_key_hold_timeout_existing_touch_cornercase, LITEST_TOUCHPAD, LITEST_ANY);
  6144. litest_with_parameters(params, "timeout", 'u', 4, 0, 120, 300, 900) {
  6145. litest_add_parametrized(touchpad_dwt_type, LITEST_TOUCHPAD, LITEST_ANY, params);
  6146. }
  6147. litest_add(touchpad_dwt_type_short_timeout, LITEST_TOUCHPAD, LITEST_ANY);
  6148. litest_add(touchpad_dwt_shift_combo_triggers_dwt, LITEST_TOUCHPAD, LITEST_ANY);
  6149. litest_add(touchpad_dwt_modifier_no_dwt, LITEST_TOUCHPAD, LITEST_ANY);
  6150. litest_add(touchpad_dwt_modifier_combo_no_dwt, LITEST_TOUCHPAD, LITEST_ANY);
  6151. litest_add(touchpad_dwt_modifier_combo_dwt_after, LITEST_TOUCHPAD, LITEST_ANY);
  6152. litest_add(touchpad_dwt_modifier_combo_dwt_remains, LITEST_TOUCHPAD, LITEST_ANY);
  6153. litest_add(touchpad_dwt_fkeys_no_dwt, LITEST_TOUCHPAD, LITEST_ANY);
  6154. litest_add(touchpad_dwt_tap, LITEST_TOUCHPAD, LITEST_ANY);
  6155. litest_add(touchpad_dwt_tap_drag, LITEST_TOUCHPAD, LITEST_ANY);
  6156. litest_add(touchpad_dwt_click, LITEST_TOUCHPAD, LITEST_ANY);
  6157. litest_add(touchpad_dwt_edge_scroll, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  6158. litest_add(touchpad_dwt_dont_interrupt_edge_scroll, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  6159. litest_add(touchpad_dwt_dont_interrupt_gesture_swipe, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6160. litest_add(touchpad_dwt_dont_interrupt_gesture_pinch, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6161. litest_add(touchpad_dwt_dont_interrupt_tap_drag, LITEST_TOUCHPAD, LITEST_ANY);
  6162. litest_add(touchpad_dwt_dont_interrupt_buttons, LITEST_TOUCHPAD, LITEST_ANY);
  6163. litest_add(touchpad_dwt_dont_interrupt_pointer_motion, LITEST_TOUCHPAD, LITEST_ANY);
  6164. litest_add(touchpad_dwt_pointer_motion_short_no_protect, LITEST_TOUCHPAD, LITEST_ANY);
  6165. litest_add(touchpad_dwt_config_default_timeout, LITEST_TOUCHPAD, LITEST_ANY);
  6166. litest_add(touchpad_dwt_config_default_on, LITEST_TOUCHPAD, LITEST_ANY);
  6167. litest_add(touchpad_dwt_config_default_off, LITEST_ANY, LITEST_TOUCHPAD);
  6168. litest_add(touchpad_dwt_disabled, LITEST_TOUCHPAD, LITEST_ANY);
  6169. litest_add(touchpad_dwt_disable_during_touch, LITEST_TOUCHPAD, LITEST_ANY);
  6170. litest_add(touchpad_dwt_disable_before_touch, LITEST_TOUCHPAD, LITEST_ANY);
  6171. litest_add(touchpad_dwt_disable_during_key_release, LITEST_TOUCHPAD, LITEST_ANY);
  6172. litest_add(touchpad_dwt_disable_during_key_hold, LITEST_TOUCHPAD, LITEST_ANY);
  6173. litest_add(touchpad_dwt_enable_during_touch, LITEST_TOUCHPAD, LITEST_ANY);
  6174. litest_add(touchpad_dwt_enable_before_touch, LITEST_TOUCHPAD, LITEST_ANY);
  6175. litest_add(touchpad_dwt_enable_during_tap, LITEST_TOUCHPAD, LITEST_ANY);
  6176. litest_add(touchpad_dwt_remove_kbd_while_active, LITEST_TOUCHPAD, LITEST_ANY);
  6177. litest_add(touchpad_dwtp_config_default_timeout, LITEST_TOUCHPAD, LITEST_ANY);
  6178. litest_add(touchpad_dwtp_config_default_on, LITEST_TOUCHPAD, LITEST_ANY);
  6179. litest_add(touchpad_dwtp_config_default_off, LITEST_ANY, LITEST_TOUCHPAD);
  6180. litest_add_for_device(touchpad_dwt_apple, LITEST_BCM5974);
  6181. litest_add_for_device(touchpad_dwt_acer_hawaii, LITEST_ACER_HAWAII_TOUCHPAD);
  6182. litest_add_for_device(touchpad_dwt_generic_usbcombo, LITEST_GENERIC_USBCOMBO_TOUCHPAD);
  6183. litest_add_for_device(touchpad_dwt_multiple_keyboards, LITEST_SYNAPTICS_I2C);
  6184. litest_add_for_device(touchpad_dwt_multiple_keyboards_bothkeys, LITEST_SYNAPTICS_I2C);
  6185. litest_add_for_device(touchpad_dwt_multiple_keyboards_bothkeys_modifier, LITEST_SYNAPTICS_I2C);
  6186. litest_with_parameters(params, "which", 'I', 2, litest_named_i32(0, "first"), litest_named_i32(1, "second")) {
  6187. litest_add_parametrized_for_device(touchpad_dwt_multiple_keyboards_remove, LITEST_SYNAPTICS_I2C, params);
  6188. }
  6189. litest_add_for_device(touchpad_dwt_remove_before_keyboard, LITEST_KEYBOARD);
  6190. /* clang-format on */
  6191. }
  6192. TEST_COLLECTION(touchpad_palm)
  6193. {
  6194. /* clang-format off */
  6195. litest_add(touchpad_palm_detect_at_edge, LITEST_TOUCHPAD, LITEST_ANY);
  6196. litest_add(touchpad_palm_detect_at_top, LITEST_TOUCHPAD, LITEST_TOPBUTTONPAD);
  6197. litest_add(touchpad_palm_detect_at_bottom_corners, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  6198. litest_add(touchpad_palm_detect_at_top_corners, LITEST_TOUCHPAD, LITEST_TOPBUTTONPAD);
  6199. litest_add(touchpad_palm_detect_palm_becomes_pointer, LITEST_TOUCHPAD, LITEST_ANY);
  6200. litest_add(touchpad_palm_detect_top_palm_becomes_pointer, LITEST_TOUCHPAD, LITEST_TOPBUTTONPAD);
  6201. litest_add(touchpad_palm_detect_palm_stays_palm, LITEST_TOUCHPAD, LITEST_ANY);
  6202. litest_add(touchpad_palm_detect_top_palm_stays_palm, LITEST_TOUCHPAD, LITEST_TOPBUTTONPAD);
  6203. litest_add(touchpad_palm_detect_no_palm_moving_into_edges, LITEST_TOUCHPAD, LITEST_ANY);
  6204. litest_add(touchpad_palm_detect_no_palm_moving_into_top, LITEST_TOUCHPAD, LITEST_TOPBUTTONPAD);
  6205. litest_add(touchpad_palm_detect_no_tap_top_edge, LITEST_TOUCHPAD, LITEST_TOPBUTTONPAD);
  6206. litest_add(touchpad_palm_detect_tap_hardbuttons, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  6207. litest_add(touchpad_palm_detect_tap_softbuttons, LITEST_CLICKPAD, LITEST_ANY);
  6208. litest_add(touchpad_palm_detect_tap_clickfinger, LITEST_CLICKPAD, LITEST_ANY);
  6209. litest_add(touchpad_no_palm_detect_at_edge_for_edge_scrolling, LITEST_TOUCHPAD, LITEST_CLICKPAD);
  6210. litest_add(touchpad_no_palm_detect_2fg_scroll, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6211. litest_add(touchpad_palm_detect_both_edges, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6212. litest_add(touchpad_palm_detect_tool_palm, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6213. litest_add(touchpad_palm_detect_tool_palm_on_off, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6214. litest_add(touchpad_palm_detect_tool_palm_stale_after_sendevents, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6215. litest_add(touchpad_palm_detect_tool_palm_tap, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6216. litest_add(touchpad_palm_detect_tool_palm_tap_after, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6217. litest_add(touchpad_palm_detect_touch_size, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6218. litest_add(touchpad_palm_detect_touch_size_late, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6219. litest_add(touchpad_palm_detect_touch_size_keep_palm, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6220. litest_add(touchpad_palm_detect_touch_size_after_edge, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6221. litest_add(touchpad_palm_detect_touch_size_after_dwt, LITEST_APPLE_CLICKPAD, LITEST_ANY);
  6222. litest_add(touchpad_palm_detect_pressure, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6223. litest_add(touchpad_palm_detect_pressure_late_tap, LITEST_CLICKPAD, LITEST_ANY);
  6224. litest_add(touchpad_palm_detect_pressure_tap_hold, LITEST_CLICKPAD, LITEST_ANY);
  6225. litest_add(touchpad_palm_detect_pressure_tap_hold_2ndfg, LITEST_CLICKPAD, LITEST_SINGLE_TOUCH);
  6226. litest_add(touchpad_palm_detect_move_and_tap, LITEST_TOUCHPAD, LITEST_ANY);
  6227. litest_add(touchpad_palm_detect_pressure_late, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6228. litest_add(touchpad_palm_detect_pressure_keep_palm, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6229. litest_add(touchpad_palm_detect_pressure_after_edge, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6230. litest_add(touchpad_palm_detect_pressure_after_dwt, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
  6231. litest_add_for_device(touchpad_palm_ignore_threshold_zero, LITEST_TOUCHPAD_PALMPRESSURE_ZERO);
  6232. litest_add(touchpad_palm_clickfinger_pressure, LITEST_CLICKPAD, LITEST_ANY);
  6233. litest_add(touchpad_palm_clickfinger_pressure_2fg, LITEST_CLICKPAD, LITEST_ANY);
  6234. litest_add(touchpad_palm_clickfinger_size, LITEST_CLICKPAD, LITEST_ANY);
  6235. litest_add(touchpad_palm_clickfinger_size_2fg, LITEST_CLICKPAD, LITEST_ANY);
  6236. /* clang-format on */
  6237. }