PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit GTKmm in einer Shared library



Celuldor
21-03-2007, 15:43
Hallo Forum

Ich habe vor für XChat ein plugin in c++ zu schreiben
welches zusätzliche dialogfelder mittels GTKmm beinhaltet

nur hab ich da irgendein BUG drin
weil wenn ich das plugin lade und dann das dialogfeld benutzt ist zwar alles ok

aber wenn ich dann einmal das plugin entlade und neu lade habe ich beim benutzten des dialogfeldes einen sofortigen crash

hier mal die quelle zum testplugin :

#include <gtkmm.h>
// c++ `pkg-config gtkmm-2.4 --cflags --libs` -Wall -O1 -shared -fPIC gtkmm.cpp -o gtkmm.so
extern "C"
{
#include "xchat/xchat-plugin.h"
}

#define PNAME "Test"
#define PDESC "Blahs";
#define PVERSION "0.1"

static xchat_plugin *ph;


static int test_cb(char *word[], char *word_eol[], void *userdata)
{
Gtk::Main main(0,NULL);
Gtk::Window window_obj;
main.run(window_obj);
return 0;
}

extern "C"
{
int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg);
}

void xchat_plugin_get_info(char **name, char **desc, char **version, void **reserved)
{
*name = PNAME;
*desc = PDESC;
*version = PVERSION;
}

int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg)
{
ph = plugin_handle;

*plugin_name = PNAME;
*plugin_desc = PDESC;
*plugin_version = PVERSION;

xchat_hook_command(ph, "test", XCHAT_PRI_NORM, test_cb, "Usage: Test YES", 0);


xchat_print(ph, "Test plugin loaded!\n");

return(1);
}


und hier auch mal einen kleinen auszug der meldungen die beim neu laden im terminal ausgegeben werden

(xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoContext'

(xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoFont'

(xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoFontFace'

(xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoFontFamily'

soweit ich es herausfinden konnte muss es wohl irgendwie mit dem

Gtk::Main main(0,NULL); zusammenhängen :)

bin für jede hilfe dankbar

anda_skoa
21-03-2007, 21:34
Falls Gtk::Main die Haupteventloop von gtkmm ist, sollte das Plugin besser die Eventloop des Programms mitbenutzen.

Hast du schon probiert das main Objekt nicht anzulegen (und main.run nicht zu verwenden)?

Ciao,
_

Celuldor
22-03-2007, 14:18
dann passiert das :
(xchat:3598): GLib-GObject-CRITICAL **: g_object_set_qdata_full: assertion `quark > 0' failed
Speicherzugriffsfehler
und zwar direkt beim ersten aufruf des dialoges

anda_skoa
22-03-2007, 15:56
Hmm, XChat ist aber schon eine GTK+ Anwendung oder?

Ciao,
_

Celuldor
22-03-2007, 17:24
ähm ... ja

anda_skoa
23-03-2007, 14:13
In dem Versuch, wo du das Main Objekt weglässt, hast du dort den Dialog auch am Heap angelegt (also mit new)?

Falls ja, bzw. falls das nichts ändert, eventuell auch das Main Objekt aber nicht mit run() starten

Ciao,
_

Celuldor
27-03-2007, 17:09
sry aber das versteh ich nun nicht :-)
könntest du das mit nem kleinen beispiel verdeutlichen ?

anda_skoa
28-03-2007, 17:23
Hmm, scheint hier keiner zu wissen :(

Besser du suchst mal nach einer Mailingliste von gtkmm und fragst, wie man gtkmm Code als Plugin in einer GTK+ Applikation verwendet.

Ciao,
_

Celuldor
28-03-2007, 20:30
ne mailinglist zu finden ist nicht das problem^^
http://www.gtkmm.org/mailinglist.shtml

was schwieriger wird ist die verständigung (ich kann kein englisch) :-(

RapidMax
31-03-2007, 21:53
Ich denke der Fehler liegt in dem besagten gtk::main, der mit dem Main-Loop von XChat Probleme verursacht. Lass das weg, auch das main.run(). Das Fenster musst du vermutlich mit window_obj.show() bzw. show_all() anzeigen lassen.
Auch das von anda_skoa bemängelte Anlegen auf dem Stack ist nicht sauber, da das Objekt ja am Ende der Funktion wieder zerstört wird. Hier ist natürlich fraglich, wie die GObjekte in GTKmm implementiert sind, aber um sicher zu sein würde ich das Fenster mit new() auf dem Heap anlegen.

Gruss, Andy