ctypes und Callbacks
Verfasst: Freitag 12. Juni 2009, 23:08
Hi,
Ich dachte mir heute, dass ich versuche etwas nicht komplett triviales mit ctypes zu wrappen und habe mich für LibUnique entschieden. Abgesehen davon dass je mehr ich davon sehe, desto schlechter finde ichs geht es eigentlich ganz gut vorran. Ich kann inzwischen feststellen ob bereits eine Instanz/Exemplar der Applikation läuft. Nun würde ich gerne aber noch einen Schritt weiter gehen und Nachrichten umherschicken können.
Dazu habe ich mir das Beispiel von der LibUnique-Seite genommen und es angepasst so dass es immhin irgendwie kompiliert (es funktioniert zwar nicht richtig, aber ausreichend gut, um es auszuprobieren.
Kompiliert wird es mit
(man muss dazu die libunique-1.0 zusammen mit den Headern etc. installiert haben, ist beim aktuellen Ubuntu und Debian Squeeze dabei, ich hab einfach einen Backport für Lenny erstellt)
Das funktioniert nun ausreichend gut. Mein zusammengehackter Python-Code tut auch relativ gut, bis eben auf die Callbacks.
Im C-Beispiel steht etwa folgendes:
``g_signal_connect`` ist ein Makro aus GObject dass intern ``g_signal_connect_data`` aufruft. Das habe ich mal nachgebaut, alledings macht mir der G_CALLBACK-Makroaufruf etwas Sorgen, denn da wird ein Cast der Funktion zu ``GCallback`` gemacht, wo ich nicht recht weiß wie das mit ctypes möglich ist. Den Callback habe ich so definiert wie in der ctypes-Doku, die Typen habe ich aus dem C-Beispiel und sollten eigentlich stimmen.
Schließlich ist es wohl auch so, dass die Messages nur zugestellt werden können, wenn ``gtk.gtk_main()`` aufgerufen wird. Dann Segfaultet es allerdings sofort, wenn eine Nachricht zugestellt werden soll.
Irgendwo ist da noch der Wurm drin und es würde mich freuen wenn mich jemand mir den ein oder anderen Tipp geben würde.
P.S.: Ja, das ist Python 3-Code. Irgendwer muss ja anfangen und da ctypes in der Stdlib ist, bot sich das an.
Ich dachte mir heute, dass ich versuche etwas nicht komplett triviales mit ctypes zu wrappen und habe mich für LibUnique entschieden. Abgesehen davon dass je mehr ich davon sehe, desto schlechter finde ichs geht es eigentlich ganz gut vorran. Ich kann inzwischen feststellen ob bereits eine Instanz/Exemplar der Applikation läuft. Nun würde ich gerne aber noch einen Schritt weiter gehen und Nachrichten umherschicken können.
Dazu habe ich mir das Beispiel von der LibUnique-Seite genommen und es angepasst so dass es immhin irgendwie kompiliert (es funktioniert zwar nicht richtig, aber ausreichend gut, um es auszuprobieren.
Kompiliert wird es mit
Code: Alles auswählen
gcc $(pkg-config --cflags unique-1.0) $(pkg-config --libs unique-1.0) demo.c -o demo
Das funktioniert nun ausreichend gut. Mein zusammengehackter Python-Code tut auch relativ gut, bis eben auf die Callbacks.
Im C-Beispiel steht etwa folgendes:
Code: Alles auswählen
g_signal_connect (app, "message-received", G_CALLBACK (message_received_cb), NULL);
Schließlich ist es wohl auch so, dass die Messages nur zugestellt werden können, wenn ``gtk.gtk_main()`` aufgerufen wird. Dann Segfaultet es allerdings sofort, wenn eine Nachricht zugestellt werden soll.
Irgendwo ist da noch der Wurm drin und es würde mich freuen wenn mich jemand mir den ein oder anderen Tipp geben würde.
P.S.: Ja, das ist Python 3-Code. Irgendwer muss ja anfangen und da ctypes in der Stdlib ist, bot sich das an.