Es handelt sich um einen Hanns-G HT225HPB, 21.5" Monitor. Ich erstelle eine Xojo-App für einen Info-Monitor (Kiosk-System), die mit einem Touchscreen bedient werden soll. Der Touch-Teil des Monitors ist per USB mit dem Rechner verbunden, der Bild-Teil per HDMI. Betriebssystem ist das aktuelle Raspbian Stretch auf einem 3+. Normalerweise esetzt der Touch ja schlicht und einfach die Maus, ein Tip auf die richtige Stelle und ein Button feuert den "Action"- oder eine Listbox den "Change"-Event ... und gut ist. Leider scheint das unter Linux nicht so zu stimmen. Wenn ich z.B. den Finger rel. "zaghaft" auf einen Button setze, bekommt der zwar den Focus oder wechselt sogar optisch in den Zustand "gedrückt", aber sonst passiert nix. Verfahre ich so mit einer Listbox, wird die betreffende Zeile zwar ge-highlighted, aber der Change-Event nicht ausgelöst und der Listindex ändert sich auch nicht. Bei den Buttons habe ich mir damit geholfen, dass alle möglichen Events (Action, GotFocus, MouseEnter, MouseDown, MouseUp) die gleiche Funktion auslösen, natürlich durch eine Logik verknüpft, um Mehrfachauslösungen zu vermeiden. So werden immerhin (geschätze) 95% aller Fingertips erkannt ... Mit Maus-Bedienung funktioniert die Anwendung übrigens absolut genau so, wie sie soll, jeder Klick wird erkannt. Bei der Listbox ist das ungleich schwieriger, hier habe ich nur Chage und CellKlick zusammenfassen können, was die "Ausbeute" auf max. 50% bringt. Mir scheint, dass die Ursache eine Art "Drucksensitivität" des Touch ist, obwohl Nichts dergleichen in dessen technischer Beschreibung steht, während es bei der Maus nur Klick oder nicht Klick gibt. Kann man das Touch-Verhalten auf System-Ebene irgendwie "eindeutiger" machen? Eigentlich ist das aber alles Sch**ße - kann man das Problem nicht an der Wurzel packen? Wiso gibt es überhaup solche halbgaren Reaktionen? Danke für Tips.
gibt es sowas wie onTouch das Du noch abfangen musst? Touchscreens mit "drucksensitivität" sind mir noch nicht untergekommen. Drucksensitivität kenne ich nur von Grafiktabletts. Wenn das HTML/Javascript ist, gibt es bei TouchEvent u.U, mehrere erkannte Finger die man auswerten kann aber man kann auch nur auf den ersten reagieren.
Frank E. schrieb: > kann man das Problem nicht an der Wurzel packen? Das Problem scheint zu sein, daß Du den Unterschied zwischen Touch und Maus nicht zu verstehen scheinst. Bei einer Maus ist Klicken und Zeigerbewegen klar voneinander zu unterscheiden - kein Wunder, macht ja auch unterschiedliche Hardware. Bei Touch ist das anders, wenn damit ein Mauszeiger bewegt werden soll, muss das vom Klicken oder gar dem Bewegen mit gedrückter Maustaste unterschieden werden. Deswegen erzeugt der Touchtreiber jede Menge unterschiedlicher Events, die Deine Anwendung auseinanderhalten muss.
Frank E. schrieb: > Eigentlich ist das aber alles Sch**ße - kann man das Problem nicht an > der Wurzel packen? Wiso gibt es überhaup solche halbgaren Reaktionen? Nun bisher bin ich davon ausgegangen dass du nur Probleme mit Netzwerktechnik hast. Aber das Problem scheint allgemeiner. Lösung: Sag deinem Kunden, er soll ein Teil nehmen was auch unter Linux funktioniert. ups Du hast es selbst rausgesucht? Dann würde ich auf der HP schauen ob die Touchdriver für Linux anbieten. ups Die haben nichts? Dann würde ich mal googlen ob es andere Leute gibt die vielleicht eine Lösung gefunden haben. ups Dein Google geht auch nicht? Ich nach das mal für dich.... raspberrypi.stackexchange.com/questions/60383/ Thomas
Ich mache jetzt mal vorerst die wilde Annahme, dass deine Anwendung nicht das Problem ist. Ich habe viele Geräte mit Linux und Touchscreen, aber so ein Problem hatte ich noch nie. Schau erstmal nach, ob die richtigen Events überhaupt generiert werden. Allgemein geht das mit evtest. Um zu sehen, was der X Server liefert, falls man den verwendet, kann man noch X Input verwenden. Hier mal ein paar ausgaben eines meiner Touchscreens zum vergleich. Hier mit XInput, ein 4 mal drauf gedrückt, 2mal dabei noch die Position geändert, plus noch die Abfrage interessanter Einstellungen:
1 | daniel@colibri:~$ grep "input driver" /var/log/Xorg.0.log |
2 | [ 8.060] (II) Using input driver 'libinput' for 'Video Bus' |
3 | [ 8.103] (II) Using input driver 'libinput' for 'Surface Pro 3/4 Buttons' |
4 | [ 8.136] (II) No input driver specified, ignoring this device. |
5 | [ 8.137] (II) No input driver specified, ignoring this device. |
6 | [ 8.137] (II) No input driver specified, ignoring this device. |
7 | [ 8.137] (II) No input driver specified, ignoring this device. |
8 | [ 8.137] (II) No input driver specified, ignoring this device. |
9 | [ 8.138] (II) No input driver specified, ignoring this device. |
10 | [ 8.138] (II) Using input driver 'libinput' for 'Microsoft LifeCam Front: Micros' |
11 | [ 8.200] (II) Using input driver 'libinput' for 'Microsoft LifeCam Rear: Microso' |
12 | [ 8.244] (II) No input driver specified, ignoring this device. |
13 | [ 8.245] (II) No input driver specified, ignoring this device. |
14 | [ 8.245] (II) Using input driver 'libinput' for 'NTRG0001:01 1B96:1B05 Pen' |
15 | [ 8.327] (II) No input driver specified, ignoring this device. |
16 | [ 8.327] (II) Using input driver 'libinput' for 'NTRG0001:01 1B96:1B05' |
17 | [ 8.356] (II) No input driver specified, ignoring this device. |
18 | [ 7289.305] (II) No input driver specified, ignoring this device. |
19 | [ 7289.343] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control' |
20 | [ 7289.356] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control' |
21 | [ 7289.358] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Keyboard' |
22 | [ 7289.376] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Touchpad' |
23 | [ 18558.484] (II) No input driver specified, ignoring this device. |
24 | [ 18558.515] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Keyboard' |
25 | [ 18558.533] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control' |
26 | [ 18558.557] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control' |
27 | [ 18558.559] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Touchpad' |
28 | [ 21116.061] (II) No input driver specified, ignoring this device. |
29 | [ 21116.088] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Keyboard' |
30 | [ 21116.118] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control' |
31 | [ 21116.134] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Consumer Control' |
32 | [ 21116.135] (II) Using input driver 'libinput' for 'Microsoft Surface Type Cover Touchpad' |
33 | daniel@colibri:~$ xinput |
34 | ⎡ Virtual core pointer id=2 [master pointer (3)] |
35 | ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] |
36 | ⎜ ↳ NTRG0001:01 1B96:1B05 id=11 [slave pointer (2)] |
37 | ⎜ ↳ Microsoft Surface Type Cover Consumer Control id=13 [slave pointer (2)] |
38 | ⎜ ↳ Microsoft Surface Type Cover Touchpad id=15 [slave pointer (2)] |
39 | ⎣ Virtual core keyboard id=3 [master keyboard (2)] |
40 | ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] |
41 | ↳ Video Bus id=6 [slave keyboard (3)] |
42 | ↳ Surface Pro 3/4 Buttons id=7 [slave keyboard (3)] |
43 | ↳ Microsoft LifeCam Front: Micros id=8 [slave keyboard (3)] |
44 | ↳ Microsoft LifeCam Rear: Microso id=9 [slave keyboard (3)] |
45 | ↳ NTRG0001:01 1B96:1B05 Pen id=10 [slave keyboard (3)] |
46 | ↳ Microsoft Surface Type Cover Keyboard id=12 [slave keyboard (3)] |
47 | ↳ Microsoft Surface Type Cover Consumer Control id=14 [slave keyboard (3)] |
48 | daniel@colibri:~$ xinput list --long 11 |
49 | NTRG0001:01 1B96:1B05 id=11 [slave pointer (2)] |
50 | Reporting 6 classes: |
51 | Class originated from: 11. Type: XIButtonClass |
52 | Buttons supported: 7 |
53 | Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" |
54 | Button state: |
55 | Class originated from: 11. Type: XIValuatorClass |
56 | Detail for Valuator 0: |
57 | Label: Abs MT Position X |
58 | Range: 0.000000 - 65535.000000 |
59 | Resolution: 0 units/m |
60 | Mode: absolute |
61 | Current value: 44204.000000 |
62 | Class originated from: 11. Type: XIValuatorClass |
63 | Detail for Valuator 1: |
64 | Label: Abs MT Position Y |
65 | Range: 0.000000 - 65535.000000 |
66 | Resolution: 0 units/m |
67 | Mode: absolute |
68 | Current value: 49817.000000 |
69 | Class originated from: 11. Type: XIValuatorClass |
70 | Detail for Valuator 2: |
71 | Label: Rel Horiz Scroll |
72 | Range: -1.000000 - -1.000000 |
73 | Resolution: 0 units/m |
74 | Mode: relative |
75 | Class originated from: 11. Type: XIValuatorClass |
76 | Detail for Valuator 3: |
77 | Label: Rel Vert Scroll |
78 | Range: -1.000000 - -1.000000 |
79 | Resolution: 0 units/m |
80 | Mode: relative |
81 | Class originated from: 11. Type: XITouchClass |
82 | Touch mode: direct |
83 | Max number of touches: 15 |
84 | |
85 | daniel@colibri:~$ xinput --list-props 11 |
86 | Device 'NTRG0001:01 1B96:1B05': |
87 | Device Enabled (141): 1 |
88 | Coordinate Transformation Matrix (143): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 |
89 | libinput Calibration Matrix (280): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 |
90 | libinput Calibration Matrix Default (281): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 |
91 | libinput Send Events Modes Available (263): 1, 0 |
92 | libinput Send Events Mode Enabled (264): 0, 0 |
93 | libinput Send Events Mode Enabled Default (265): 0, 0 |
94 | Device Node (266): "/dev/input/event3" |
95 | Device Product ID (267): 7062, 6917 |
96 | |
97 | daniel@colibri:~$ xinput --test 11 |
98 | motion a[0]=41603 a[1]=40380 |
99 | button press 1 a[0]=41603 a[1]=40380 |
100 | motion a[0]=41603 a[1]=40380 |
101 | button release 1 a[0]=41603 a[1]=40380 |
102 | motion a[0]=39733 a[1]=48980 |
103 | button press 1 a[0]=39733 a[1]=48980 |
104 | motion a[0]=39808 a[1]=49053 |
105 | motion a[0]=40033 a[1]=49335 |
106 | motion a[0]=40368 a[1]=49754 |
107 | motion a[0]=40791 a[1]=50427 |
108 | motion a[0]=40791 a[1]=50427 |
109 | button release 1 a[0]=40791 a[1]=50427 |
110 | motion a[0]=32163 a[1]=54604 |
111 | button press 1 a[0]=32163 a[1]=54604 |
112 | motion a[0]=32170 a[1]=54586 |
113 | motion a[0]=32177 a[1]=54550 |
114 | motion a[0]=32190 a[1]=54504 |
115 | motion a[0]=32211 a[1]=54441 |
116 | motion a[0]=32238 a[1]=54350 |
117 | motion a[0]=32293 a[1]=54222 |
118 | motion a[0]=32347 a[1]=54058 |
119 | motion a[0]=32436 a[1]=53822 |
120 | motion a[0]=32497 a[1]=53649 |
121 | motion a[0]=32497 a[1]=53649 |
122 | button release 1 a[0]=32497 a[1]=53649 |
123 | motion a[0]=41084 a[1]=52666 |
124 | button press 1 a[0]=41084 a[1]=52666 |
125 | motion a[0]=41084 a[1]=52666 |
126 | button release 1 a[0]=41084 a[1]=52666 |
evtest Beispiel ist im Anhang. Neben den Angaben von oben aber bei dir wären die Ausgabe von "cat /proc/bus/input/devices" und dmesg auch noch nützlich. Damit könnte man sehen, ob das Problem beim Touchscreen/Treiber und dessen ausgegebenen Daten, oder woanders liegt. In letzterem Fall könnte der verwendete X11 input Treiber oder eine Einstellung davon problematisch sein, oder auch der verwendete Window Manager (oder gar das fehlen davon). Sobald man weiss, wo das Problem liegt, kann man es lösen.
Rufus Τ. F. schrieb: > Frank E. schrieb: >> kann man das Problem nicht an der Wurzel packen? > > Das Problem scheint zu sein, daß Du den Unterschied zwischen Touch und > Maus nicht zu verstehen scheinst. Bei einer Maus ist Klicken und Was soll der Unfug? > Zeigerbewegen klar voneinander zu unterscheiden - kein Wunder, macht ja > auch unterschiedliche Hardware. Ist ein entschlossener Tip per Touchscreen auf einen Button etwa kein Klick? Außerdem schrieb ich ja, dass ich das Button-Problem mit der Zusammenfassung der unterschiedlichsten Events fast perfekt erledigt habe. Bei der erreichten Erfolgsrate wird ein Benutzer bei einer der rel. seltenen Nicht-Reaktionen eher an einen eigenen Fehler glauben und einfach nochmal tippen. Problematisch ist eher die Listbox. Dieses GUI-Element kann eigentlich gar keinen Unterschied zwischen dem wechselnden Highlighting einer Zeile, dem entsperechenen Change-Event und dem zugehörigen Property "Listindex" machen, schaft es aber - unter Linux - trotzdem. Am Mac habe ich noch keinen Touchmonitor ausprobiert, aber unter Windows schon, und dort gibt es das Problem definitiv nicht. Muss ich also von einem Bug in Xojo ausgehen?
Daniel A. schrieb: > Ich mache jetzt mal vorerst die wilde Annahme, dass deine > Anwendung > nicht das Problem ist. > > Ich habe viele Geräte mit Linux und Touchscreen, aber so ein Problem > hatte ich noch nie. Schau erstmal nach, ob die richtigen Events > überhaupt generiert werden. Allgemein geht das mit evtest. Um zu sehen, > was der X Server liefert, falls man den verwendet, kann man noch X Input > verwenden. Hier mal ein paar ausgaben eines meiner Touchscreens zum > vergleich. > > ... Oh, sehr komplexe Angelegenheit. So tief wollte ich als Anwendungsentwickler eigentlich nicht einsteigen. Ich nahm bisher an - und unter Windows ist das auch so - dass ein nicht über spezielle Treiber eingebundener Touch als HID einfach eine Maus emuliert ... was er ja meistens auch tut, nur eben nicht zuverlässig. Meine Anwendung ist kein Multipoint- Projekt ...
Beim xinput --test ist das wichtige einfach, dass das "button press 1" und "button release 1" beim draufdrücken kommt. Wenn das da ist, ist des Problem vermutlich der X window manager. Angenommen, es wird X11 verwendet, und nicht wayland oder Framebufferanwendungen oder so.
Es kommt vermutlich zu spät, aber das Problem lag mit ziemlicher Sicherheit an der Firmware des Bildschirms. Ich habe exakt das beschriebene Phänomen mit dem Bildschirm und einem Raspberry Pi 4 sowohl unter Raspbian als auch unter Android 11 (OmniROM) erlebt, während es aber an einem Windows-PC tadesllos reagiert hat. Habe dann von der Hersteller-Seite ein Tool runtergeladen (google nach TC_PTool_2008, ist dann eine WIN8.rar) und danach reagierte das Display auch unter Raspbian und Android wie erwartet.
Danke für die (wenn auch späte) Rückmeldung. Es gibt ja hier so Experten, die immer nur die Hälfte lesen und dann überheblich und allwissend tun - um so wohltuender ist mal eine Antwort, die mein Problem versteht und wenigstens teilweise nachvollziehen kann. Allerdings ist da sicher nicht nur in der Firmware des Bildschirmes ein Bug, sondern auch irgendwie im Linux-Unterbau oder meiner Xojo-IDE ebenfalls. Denn wenn ein GUI-Element sich zwar beim Anklicken/tippen einfärbt und dann aber nicht auch der zugehörige Event-Handler ausgelöst wird, ist sicher nicht nur der Bildschirm, daran schuld ... es ei denn, es gibt (systemintern) abartig exotischen Varinten von Events, mit denen aber sonst nienand rechnet ... Wie ich weiter oben schrieb, ich "missbrauche" den Mouse-Enter-Event (Betreten des GUI-Elements), der sehr zuverlässig kommt. Beim Eintreffen dieses Events befördere ich die Maus per System-Call sofort wieder in die linke untere Ecke, so dass jeder neue Tip auf ein GUI-Element mit Sicherheit auch ein Mouse-Enter auslöst ... damit kann ich leben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.