Seite 1 von 2

Suche äquivalente Linux-API-Befehle zu WinAPI-Befehlen

Verfasst: 31.08.2009 10:43
von NicTheQuick
Ich weiß nicht, wie viele sich schon mit der API von Linux rumgeschlagen haben, aber
ich bin jetzt gerade auf ein paar Probleme gestoßen als ich meine Raytracing-Engine
portieren wollte.

Unter anderem muss deswegen folgende WinAPI-Befehle übersetzen: GetAsyncKeyState_()
Dafür habe ich folgende Linux-Äquivalente gefunden, die aber nicht so funktionieren,
wie ich es annahm:
getc_(0) : 0 ist die Konstante für stdin und getc_() ist eigentlich dafür gedacht um aus
einer Datei zu lesen. Mit der 0 wird aber vom Standard-Input gelesen. Leider stürzt das
Programm dann aber ab.
getc_unlocked(0) : Hier passiert das selbe wie bei getc_(0)
getchar_() : Das Programm bleibt bei dem Befehl stehen, aber egal, welche Taste ich
drücke, es geht nicht weiter.
getchar_unlocked_() : Hier wieder das selbe wie bei getchar_unlocked_()

Welche Alternative gibt es da noch?

Der nächste zu übersetzende Befehl ist: 'SetCursorPos_()'
Hier habe ich noch nichts vergleichbares gefunden. Weiß da jemand Rat?

Wenn weitere Probleme entstehen, meld ich mich dann wieder. <)

Verfasst: 31.08.2009 12:28
von mk-soft
Must wohl im internet mal nach GTK, SLD, etc suchen. Ist schon eine goße umstellung gegen über WinAPI.

Hier mal schon ein Link zu GTK
http://library.gnome.org/devel/gtk/stable

:wink:

Verfasst: 31.08.2009 12:44
von DarkDragon
Vielleicht ist das hier noch etwas (Ich verstehe sowieso nicht was an GTK so toll ist wo man doch direkt mit X kommunizieren kann :-) ):

http://tronche.com/gui/x/xlib/input/XGrabPointer.html
http://tronche.com/gui/x/xlib/input/XWarpPointer.html
http://tronche.com/gui/x/xlib/display/o ... ml#Display

Sorry, das Forum spinnt hier grad gewaltig und desshalb sind hier zuerst 2 Beiträge gestanden.

Verfasst: 31.08.2009 12:48
von FloHimself
getc / getchar sind im Prinzip korrekt (für Konsolen-basierte Programme). Da es sich bei deiner Raytracing-Engine aber um eine "Anwendung für X" handeln wird, kann nicht einfach von stdin gelesen werden; dort wird keine Tastatureingabe ankommen.

Du könntest von einem Input-Device aus /dev/input/event* lesen.
In /proc/bus/input/devices stehen die vorhandenen Keyboard-Devices...

Das wäre ziemlich "low-level" und spätestens bei "SetCurserPos" hättest du ein neues Problem.

Vielleicht ist die Schnittstelle von Xlib das was du suchst?

http://tronche.com/gui/x/xlib/

Verfasst: 31.08.2009 16:54
von Vermilion
Wollte gerade auch schon sagen als ich deinen Post gelesen habe, die X-Server API scheint wohl das zu sein, was du suchst.

Verfasst: 31.08.2009 16:56
von DarkDragon
Vermilion hat geschrieben:Wollte gerade auch schon sagen als ich deinen Post gelesen habe, die X-Server API scheint wohl das zu sein, was du suchst.
3 Leute 1 Gedanke. :lol:

Verfasst: 31.08.2009 16:57
von NicTheQuick
Wird wohl noch dauern, bis ich das mal genauer testen kann.

Auf einmal will mein pbcompiler nicht mehr starten.
Und eben ist die IDE dreimal nacheinander mit einem "Segmentation Fault" abgestürzt, weil
ich einen Buchstaben schreiben wollte. :|

Ich glaube ich packe PureBasic doch mal unter /opt/purebasic/ statt ~/programme/purebasic

Da kann auf jeden Fall nichts mit den Dateien passieren.

Verfasst: 31.08.2009 18:20
von NicTheQuick
Folgender Code:

Code: Alles auswählen

XWarpPointer_(#Null, #Null, #Null, 0, 0, 0, 0, 100, 100)
Debug "test2"
MessageRequester("", "test")
[COMPILER] Zeile 1: XWarpPointer_() is not a function, array, macro or linked list.
Ich fühle mich grad wieder wie ein Anfänger. :lol:

Was hab ich nun wieder falsch gemacht? Hat jemand liebenswürdigerweise ein
funktionierendes Code-Beispiel, wie ich mit dem Befehl umgehen muss?


Naja, wenn ich schonmal hier bin, gleich die nächste Frage zu meinem eigentlich Problem:
Ich will ein Fenster erstellen und den Mauscursor immer in der Mitte des Fensters belassen.
Wenn man die Maus dann bewegt, soll sich die Kamera drehen. Wie in einer Art
Ego-Shooter. So hatte ich es bisher auch unter Windows immer gemacht.
Jetzt hab ich aber gesehen, dass 'SetCursorPos_()' keine Events wirft, aber
'XWarpPointer_()' hingegen schon. Das heißt bei jedem Zurücksetzen des bewegten
Cursors auf die Mitte des Fenster würden Gegenevents zur Benutzerbewegung
erzeugt werden, was die ganze Aktion dann ziemlich sinnlos machen würde.

Wie würdet ihr das sonst machen?


Ich kopier PureBasic jetzt endlich mal nach /opt/. ^^

Verfasst: 31.08.2009 18:40
von Little John
NicTheQuick hat geschrieben:Und eben ist die IDE dreimal nacheinander mit einem "Segmentation Fault" abgestürzt, weil
ich einen Buchstaben schreiben wollte. :|
Du sollst auch nicht immer so viele Buchstaben schreiben. :lol:
(Sorry, den Scherz konnte ich mir nicht verkneifen.)


Eine Frage an die "X-perten" ;-):
Wenn man die Schnittstelle von Xlib verwendet, kann es dann sein dass das Programm auf best. Linux-Distributionen nicht läuft, oder wie kompatibel ist das?

Gruß, Little John

Verfasst: 31.08.2009 22:08
von Vermilion
[COMPILER] Zeile 1: XWarpPointer_() is not a function, array, macro or linked list.
Im Gegensatz zur GTK und SDL API ist die vom X Server nicht bei PureBasic dabei. D.h. du musst die Shared Objects wohl manuell öffnen und die entsprechenden Funktionen manuell importieren.
Falls es nicht so geht, wie oben geschrieben mit der Ansprechung einer bestimmten "Datei" in "/dev/".