Neues Fenster (als Thread gestartet) klaut mir die Tastatur im Hauptprogramm



  • Ich bräuchte Eure Hilfe für folgendes Problem:

    Ich habe ein Hauptprogramm zur Steuerung eines Automaten geschrieben (in C unter Linux 8.0), das u. a. kontinuierlich die Tastatur abfragen muss. Das Hauptprogramm funktioniert soweit einwandfrei.

    Zusätzlich habe ich eine grafische Oberfläche geschrieben (unter C in SDL). Diese Grafik bedient sich einiger globalen Variablen aus dem Hauptprogramm und wird vom Hauptprogramm einfach als Thread (pthread_create()) gestartet. Die Grafik brauch nur auf den Bildschirm ausgegeben zu werden und benötigt keine Rückmeldungen (Buttons, Eingabefelder, o. ä.) vom Anwender. Die gesamte Steuerung des Automaten übernimmt das Hauptprogramm durch die Abfrage der Tastatur.

    Jetzt das Problem. Sobald die Grafik (als Thread) gestartet wird, wird SDL initialisiert und erzeugt damit beim Aufruf auch ein neues Fenster. Das neue Fenster zieht damit allerdings auch den Focus auf sich (wahrscheinlich X11), so dass auch die Tastatur (also die Standardeingabe) auf die Grafik übertragen wird. Das Hauptprogramm empfängt jetzt keine Eingaben der Tastatur mehr.

    Auf dem Entwicklungsrechner konnte ich jetzt einfach einmal in das Terminal klicken, in dem das Hauptprogramm lief und damit wurde auch die Tastatureingabe wieder auf das Hauptprogramm umgeleitet. Auf dem Automatenrechner habe ich aber dazu nicht die Möglichkeit. Erstens habe ich da keine Maus und zweitens ist die Grafik im Vollbild dargestellt und ich komme nicht mehr an das Hauptprogramm.

    Jetzt meine Fragen:

    Kann ich direkt unter C den Focus wieder auf das aufrufende Programm zurückgeben oder bei der Erzeugung des Threads die Standardeingabe direkt beim aufrufenden Programm belassen? Mit dem Kopieren und Umleiten der Standardeingabe habe ich schon herumgebastelt, bisher aber ohne Erfolg. Ich möchte die Grafikroutine auch nicht als neuen Prozess starten, weil ich dann die relevanten Daten z. B. über eine pipe schaufeln müsste und dann Probleme mit der Synchronisation bekomme. Vielleicht kann man die Grafik ja auch ohne die Tastatur initialisieren? Oder gibt es eine X11/Linux Lösung bei der zwar ein neues Fenster geöffnet wird, allerdings dieses neue Fenster nicht den Focus erhält?

    Also Ihr seht, ich bin für jede Hilfe und alle Ideen dankbar. Ich sitze jetzt schon seit einigen Tagen an diesem Problem, deshalb seit mir nicht böse wenn ich etwas mehr geschrieben habe und dieses Posting vielleicht in einem anderen Board oder einer anderen Liste noch mal auftaucht.



  • Hi,

    wenn ueberhaupt, muesste man das IMHO bei den Eigenschaften des Fensters,
    welches du erzeugst, einstellen koennen, ob dieses sofort den Focus bekommt
    oder nicht.

    Sorry, wenn das keine direkte Hilfe ist, aber vielleicht kannst du ja nochmal
    die Einstellungsmoeglichkeiten von Fenstern, die du erzeugen kannst, ueberpruefen
    ob nicht doch irgendwo schon eine Eigenschaft definiert ist, die dir das
    gewuenschte Verhalten bringt.

    Ist es vielleicht sonst noch moeglich, der Konsole den Focus zu geben?

    mfg
    v R



  • Die entsprechenden Dokus hab ich durch. Leider finde ich keine Möglichkeit bei SDL auf das Erzeugen des Fensters und den entsprechenden Eigenschaften Einfluss zu nehmen. Trotzdem Danke!!!

    Ach ja, wenn noch jemandem einfällt wie man der Konsole (nachträglich) den Focus gibt - genau das bräuchte ich...



  • Ich bin jetzt meinem Problem ein wenig näher gerückt. So wie es aussieht habe ich bei der Erzeugung des neuen Fensters auf SDL-Ebene keine Möglichkeit, den Tastaturfocus beim aufrufenden Programm zu belassen. SDL greift wohl auf die Standard-Libary Xlib (X11) zurück.

    Zur Widerholung: Ich starte aus einem laufenden Hauptprogramm einen neuen Thread und in diesem neuem Thread eine Grafik (programmiert mit SDL). Sobald diese Grafik in einem neuen Fenster geöffnet wird übernimmt das neue Fenster den Focus und damit auch die Tastaturkontrolle. Die Tastatur soll aber weiterhin vom (jetzt im Hintergrund laufenden) Hauptprogramm abgefragt werden können.

    Jetzt also meine neue Frage: Ist es unter X11 (xlib) möglich, den Focus nicht an das neue Fenster zu übergeben? Oder kann ich den Focus in ein laufendes Programm oder an eine Konsole (in der z. B das Hauptprogramm läuft) zurückgeben. Vielleicht gibt es ja auch unter xlib die Möglichkeit, sich den Focus vom neu erzeugten Fenster zurückzuholen.

    Ich habe Funktionen wie z. B. XSetInputFocus() oder XGetInputFocus gefunden, weiß dann allerdings dabei nicht, welche Argumente ich dort einsetzten muss. Wie kann ich z. B. den Pointer der Konsole erfragen, auf den ich den Focus setzten will.

    Bin für jede Hilfe dankbar, auch für Verweise auf Homepages oder andere Boards oder Foren.

    Vielen Dank

    stexie


Anmelden zum Antworten