Pidgin Forum

Normale Version: Was ist PURPLE_CALLBACK()?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hio,
Hab mich den halben Abend in das Pluginschreiben für Pidgin eingearbeitet und habs eigentlich auch alles verstanden, bis auf eine Sache:
Die
Code:
static gboolean plugin_load(PurplePlugin *plugin);
ist ja sozusagen die Schnittstelle von Pidgin zu meinem Plugin, wo ich per
Code:
purple_signal_connect();
mein plugin mit verschiedenen events verbinde. Die ersten drei Argumente sind klar, das vierte Argument ist die Funktion die dann gerufen wird oder? (Warum muss dann immer PURPLE_CALLBACK(Funktion) da stehen?) Wofür ist dann das letze Argument?
Und wo gebe ich dann eventuelle Argumente für meine Funktion mit an? Wenn ich mich z.B. mit einer ankommenden Nachricht verbinde, dann muss ich ja auch irgendwo Sender/Empfänger/Inhalt etc. zu sehen bekommen.
Thx.
Du meinst das hier?

Der vierte Parameter ist einfach ein Zeiger auf die Funktion, die aufgerufen werden soll, wenn das Signal eintrifft.
Das fünfte ist ein Zeiger auf die Daten, die übergeben werden sollen (oder NULL).

Aus der gleichen Seite steht (etwas weiter oben) die Definition für das PURPLE_CALLBACK-Makro:
Code:
#define     PURPLE_CALLBACK(func)   ((PurpleCallback)func)

Es castet einfach nur (einen Zeiger auf) deine Funktion auf den Typ PurpleCallback, der (ein paar Zeilen darunter) so definiert ist:
Code:
typedef void(*PurpleCallback )(void)
(Also eine Funktion die einen void-Pointer erwartet und einen void-Pointer zurück gibt.)

Deine Daten übergibst du also, in dem du nicht die Daten selbst, sondern deren Adresse übergibst. (Dabei ist darauf zu achten, dass die Daten nicht auf dem Stack stehen, also keine lokalen Variablen sind.)
Ah, okay verstehe - danke.
Dann noch erstmal eine letze Frage: Über "purple_signal_connect" verbinde ich meine Funktion ja mit bestimmten Ereignissen, die ich als 2. Argument übergebe. Wo finde ich eine Liste an Argumenten, die ich dort übergeben kann? Ich meine, irgendwo muss ja stehen welcher String den ich angebe zu welchem Ereignis gehört^^

danke!
http://developer.pidgin.im/doxygen/dev/html/pages.html

(Ich weiß, die hierarchische Ordnung in der API is nicht wirklich brauchbar.)

edit: glaube ich zumindest, bei näherer Betrachtung sieht das doch etwas komplizierter aus. :o)