Wie sollte man eine Tastatur/Maus/Touchscreen abfragen ...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
alexander_ro
Beiträge: 257
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Wie sollte man eine Tastatur/Maus/Touchscreen abfragen ...

Beitrag von alexander_ro » 16.02.2017 09:52:54

Hi Mädels ... Jungs ... :-)

Für eine Benutzer KI Schnittstelle baue ich gerade so was ähnliches wie eine Linux-Shell nur soll die mit Hardware beschleunigter 3D-Grafik arbeiten können. Damit die KI Illustrationen besser anzeigen kann und die CPU vom Grafischen Output entlastet wird. Dazu benutze ich Mesa und OpenGL ES 2.0 (die Hardware kann keine neuere Version) und C++. Die Buchstaben Bitmaps generiert mir FreeType. Soweit was es tun soll und auch schon tut. Ich will möglichst nicht viele Abhängigkeiten zu anderen Paketen haben aber auch nicht alles neu erfinden. Deshalb kommt auch Freetype zum Einsatz. Laufen soll das Programm dann wie eine virtuelle Shell die beim init automatisch gestartet wird.

Was mir noch fehlt ist die Abfrage der Tastatur/Maus/Touchscreen. Man findet dazu viel im Internet aber zum Teil eignen sich diese nicht oder sind veraltet.

Tastatur und Sprach Unterstützung ist jetzt nicht das wo ich mich besonders gut auskenne. Meine Linuxe sind alle so konfiguriert das sie UTF-8 benutzen. Gefunden habe ich mehrere Sachen: std::cin oder std::wcin die geben aber schon eine bestimmte Funktionsweise vor. Das ganze wollte ich so nicht. Was ich auch noch entdeckt habe ist die Event Schnittstelle des Linux Kernels. Macht dann der Kernel auch die Umsetzung für z.B. Deutsche oder Englische Tastatur oder muss ich das dann selber Programmieren?

Oder kennt Ihr noch was besseres?

Viele Grüße
Alexander

eggy
Beiträge: 1149
Registriert: 10.05.2008 11:23:50

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von eggy » 16.02.2017 22:44:13

Auch wenns Deinem "möglichst wenige Abhängigkeiten"-Kriterium nicht ganz entspricht, schau Dir doch mal an was man mit Qt alles machen kann,
z.B. "Touchkeyboard" https://youtu.be/yIsQHinTw00

alexander_ro
Beiträge: 257
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 17.02.2017 12:44:47

Hübsch keine Frage. Aber kann man Qt verwenden wenn man keinen normalen Desktop (KDE, Gnome, Xfce) installiert hat?

MSfree
Beiträge: 2608
Registriert: 25.09.2007 19:59:30

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von MSfree » 17.02.2017 13:15:14

alexander_ro hat geschrieben:Aber kann man Qt verwenden wenn man keinen normalen Desktop (KDE, Gnome, Xfce) installiert hat?
Ja und noch viel mehr. Qt ist plattformübergreifend, Anwendungen, die mit Qt unter Linux entwickelt worden sind, laufen durch neukompilieren sogar unter MacOSX und Windows, wo es auch kein Gnome, KDE etc gibt.

alexander_ro
Beiträge: 257
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 17.02.2017 13:27:41

Schon aber bei Mac und Windows gibt es einen Desktop bei mir nicht nur EGL Mesa was man hat so braucht um OpenGL zum laufen zu bekommen. Kennst Du da vielleicht ein Beispiel irgendwo dazu? Ich habe nur welche gefunden die unter den bekannten Desktop Systemen laufen.

MSfree
Beiträge: 2608
Registriert: 25.09.2007 19:59:30

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von MSfree » 17.02.2017 13:58:47

alexander_ro hat geschrieben:Ich habe nur welche gefunden die unter den bekannten Desktop Systemen laufen.
OpenGL funktioniert sobald du einen X11-Server gestartet hast, zumindest solange die Graphikkarte OpenGL unterstützt. Von der Desktopumgebung ist das doch völlig unabhängig.

alexander_ro
Beiträge: 257
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 17.02.2017 15:29:45

Ein X11-Server ist ja schon fast ein Desktop ... ;-)
Bei mir läuft aber kein X11-Server ich habe das so gemacht: https://github.com/robclark/kmscube
Sieht bei mir ein bisschen anders noch aus aber meins habe ich noch nicht in mein Git Repo gestellt. Deshalb kann man das noch nicht öffentlich anschauen.

MSfree
Beiträge: 2608
Registriert: 25.09.2007 19:59:30

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von MSfree » 17.02.2017 15:41:26

alexander_ro hat geschrieben:Bei mir läuft aber kein X11-Server
Dann kannst du Qt auch knicken. Das setzt X11 (oder Windows oder OSX) voraus.

Benutzeravatar
schorsch_76
Beiträge: 1686
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 17.02.2017 16:26:33

Unter linux ist das devinput system für dich da. Es kann auch über "In Kernel Keymaps" übersetzten.

[1] https://www.kernel.org/doc/html/latest/ ... input.html

Desktop: AMD FX-8350 / ATI R7 260X (Gentoo amd64 + Radeon Treiber)
Laptop: Dell XPS L502S Core i7 / Nvidia 540M (Gentoo amd64)
VDR: AMD E350 + Tevii S470 + HDMI + LIRC (Debian wheezy + Kernel 3.5.4 + radeon Treiber + HDMI Audio)
Fellow der Free Software Foundation Europe

eggy
Beiträge: 1149
Registriert: 10.05.2008 11:23:50

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von eggy » 17.02.2017 17:55:39

MSfree hat geschrieben:
alexander_ro hat geschrieben:Bei mir läuft aber kein X11-Server
Dann kannst du Qt auch knicken. Das setzt X11 (oder Windows oder OSX) voraus.
Jein, bestimmte Module ja, andere nicht.

Und in der 5.8 kann man wohl direkt auf nen Wayland-Unterbau zugreifen, auf Youtube gabs nen Kurzvortrag dazu, http://blog.qt.io/blog/2016/06/13/new-c ... qtwayland/

Und dann gibts auch noch sowas
http://doc.qt.io/QtForDeviceCreation/qt ... -b2qt.html
und ganz neu wohl auf ne QML Version auf nem Minimal-Android aufsetzend

Benutzeravatar
schorsch_76
Beiträge: 1686
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 17.02.2017 21:54:48

alexander_ro hat geschrieben:Hstd::cin oder std::wcin die geben aber schon eine bestimmte Funktionsweise vor. Das ganze wollte ich so nicht.
Du könntest auch die Posix Schnittstelle nutzen fd0/1/2 und darauf mit Posix syscalls direct operieren. Das hätte nur posix als Abhängigkeit ;)

Hier wäre auch ein gutes Online BUch das ich auch in "echt" habe. Sehr gutes Buch was Posix angeht :)
The Linux Programming Interface by Michael Kerrisk

http://blog.man7.org/2009/07/whats-book-about.html
http://www.man7.org/tlpi/index.html

Desktop: AMD FX-8350 / ATI R7 260X (Gentoo amd64 + Radeon Treiber)
Laptop: Dell XPS L502S Core i7 / Nvidia 540M (Gentoo amd64)
VDR: AMD E350 + Tevii S470 + HDMI + LIRC (Debian wheezy + Kernel 3.5.4 + radeon Treiber + HDMI Audio)
Fellow der Free Software Foundation Europe

alexander_ro
Beiträge: 257
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 18.02.2017 07:45:27

Macht denn stdin etwas anderes als std::cin. Ich dachte das tut von der Funktionsweise das gleiche. Die drei stdin, stdout und stderr werden vom Kernel den Prozessen zur Verfügung gestellt?

Die evdev Schnittstelle ist glaube die Userland Seite von dem Kerneltreiber Teil den Du oben verlinkt hast.
https://en.wikipedia.org/wiki/Evdev

Das habe ich gerade auch noch entdeckt: http://thiemonge.org/getting-started-with-uinput

Das Buch sieht interessant aus aber ob es mir jetzt dabei viel hilft bin ich mir nicht sicher. Ich habe so ein ähnliches aber nicht wirklich viel hilfreiches gefunden. Scheint so als ob keiner Tastatur Eingaben in seinen Programmen benötigen würde ... :-(

Benutzeravatar
schorsch_76
Beiträge: 1686
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 18.02.2017 10:27:53

std::cin hat noch das locale stream interface. fd0/1/2 sind die direkten File Descriptoren die vom Kernel kommen.

STDIN von der C Seite hat noch libc dazwischen.

Am Ende, egal was du machst, hast du immer ein Byte das dir die Tastatur gegeben hat.

Die libc/libc++ machen noch buffering. Die File Descriptoren nicht. Die libc hat jedes Program als Abhängigkeit das mit dem gcc kompiliert wurde. Als warum nicht das nutzen? Wenn du ein grafisches OpenGL System am laufen hast, wird auch diese Bibliothek ein Tastatur Interface haben. Wie es mit Mesa direkt aussieht, weis ich gerade nicht.
Dein Programm wird vermutlich Event orientiert arbeiten. Warum nicht dann einen Thread oder asio::io_object auf dem Tastatur Interface lauschen lassen und die Tasten als Events weiter geben in der Eventqueue?

Die Randbedingungen die du für das Tastatur/Maus Interface willst sind nicht bekannt, deshalb können wir nur raten...

http://who-t.blogspot.de/2016/05/the-di ... evdev.html

Desktop: AMD FX-8350 / ATI R7 260X (Gentoo amd64 + Radeon Treiber)
Laptop: Dell XPS L502S Core i7 / Nvidia 540M (Gentoo amd64)
VDR: AMD E350 + Tevii S470 + HDMI + LIRC (Debian wheezy + Kernel 3.5.4 + radeon Treiber + HDMI Audio)
Fellow der Free Software Foundation Europe

alexander_ro
Beiträge: 257
Registriert: 16.01.2006 17:44:21
Lizenz eigener Beiträge: GNU General Public License

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von alexander_ro » 18.02.2017 14:05:31

Und ich dachte ich hätte das am Anfang so schön erklärt ... :-)

Also die normalen Sachen wie libc libstdc++ sind natürlich vorhanden. Ich meinte ja es sollen wenig Abhängigkeiten werden aber nicht keine.

Ich weiß jetzt nicht genau was Du wissen willst. Ich dachte an eine Klasse die Daten von der Tastatur Sammelt und per Event das Inputprogramm der KI Informiert das es Arbeit gibt. Eingaben sind Texte also Normale Sprache kann man vermutlich mit einem Chat-Programm vergleichen nur das gegenüber kein Mensch sondern der Computer antwortet.

Wichtig ist das ich bereits während der Eingabe man die Texte im Programm verarbeiten kann. Das geht ja mit std::cin so nicht weil man die Daten erst nach dem return erhält. Wenn man dann stdin mit open öffnet und dann mit read oder so liest geht es vermutlich. Was ich halt gerne vermeiden würde das ich die die ganzen Tastaturlayouts (also die Locale) selber interpretieren muss.

[Edit]
Maus oder Touch soll dann eine Zeichen Erkennung bekommen dann muss man nicht unbedingt die Tastatur verwenden. So irgendwann in der Zukunft vielleicht mal eine Spracherkennung.
[/Edit]

[Edit 2]
Oh hatte ich vergessen zu beantworten. Ich benutze nur Mesa sonst nicht und das hat keine Möglichkeit zur Tastatur abfrage.

Ja am Tastatur Interface lauschen ist schon das was ich auch meinte aber an welchem?
An /dev/stdin oder denen unter /dev/input ich weiß nicht was jetzt die Modernere oder bessere Methode ist.
[/Edit2]

Benutzeravatar
schorsch_76
Beiträge: 1686
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie sollte man eine Tastatur/Maus/Touchscreen abfragen .

Beitrag von schorsch_76 » 18.02.2017 19:59:00

Ich nutze bsp sehr gerne boost::asio als eventqueue ;) Da kann man auch auf einfache fds dann einen Handler laufen lassen.

Das wird bsp hier eine Idee beschrieben die ich für mich angepasst habe:
http://mostlycoding.blogspot.de/2009/05 ... lpful.html

http://www.boost.org/doc/libs/1_63_0/do ... descriptor
Da kannst du auch den fd des input device reingeben, bei "async_read() bzw. on_read()" bekommst du die Eingabedaten. Daraus machst du ein Function object das du wieder in den io_service postest. Das fo wird dann ausgeführt und mach "seine Magie, Kommandoparsing, was auch immer". Es postet seine Aktionen wieder im io_service ;)

So ähnlich wie in dem blog post.

Code: Alles auswählen

io_service.post(boost::bind(an_expensive_calculation, 42));
Wenn du dann mal Spracherkennung machen willst, hörst du am Microfon, erzeugst du ein fo, wirst es in den io_service, der führt es aus, danach kann die spracherkennung dieselbe Aktion auslösen wie bsp ein Tastaturshortcut ;) Der Trick ist, das das function object Daten tragen kann. Der io_service kann nicht nur für networking genutzt werden. Er ist eine thread safe Function object queue. Das ist der Kern von asio.

Es ist fast wie das Kommandopattern.
https://de.wikipedia.org/wiki/Kommando_ ... smuster%29

Desktop: AMD FX-8350 / ATI R7 260X (Gentoo amd64 + Radeon Treiber)
Laptop: Dell XPS L502S Core i7 / Nvidia 540M (Gentoo amd64)
VDR: AMD E350 + Tevii S470 + HDMI + LIRC (Debian wheezy + Kernel 3.5.4 + radeon Treiber + HDMI Audio)
Fellow der Free Software Foundation Europe

Antworten