Hallo zusammen
Bei meinem X11 Window Manager hab ich das starten & platzieren des 
Bildschirm Keyboards umgestellt, so dass es das jetzt selbst startet und 
xembed zum einbinden nutzt, um mehrere davon haben zu können, und mehr 
Kontrolle darüber zu haben. Jetzt muss ich das automatische 
ein/ausblenden selbst machen, statt das dem Keyboard zu überlassen. 
Anscheinend wird dafür den accessibility bus verwendet, und dafür muss 
ich wohl libatspi-2 verwenden.
Jetzt ist es aber so, libatspi-2 benötigt gobject, glib & dbus, und ich 
habe bei meinem Projekt die strikte Policy, dass ich keine harten 
Abhängigkeiten zu grossen oder invasiven externen Frameworks einführe. 
Deshalb hab ich mir ein simples auf shared Libraries basierendes Plugin 
System gebaut. Die Plugins sind alle Optional und können absichtlich 
keine Symbole des Hauptprogramms oder anderer Plugins auflösen, im 
Moment sind die aber noch teil des selben Prozesses (aber das kann sich 
noch ändern, ist etwas unschön, wenn so ein crashendes Plugin das ganze 
Programm abschiesst.). Stark vereinfacht ist das im Gunde genommen so 
gelöst:
| 1 | void* plugin = dlmopen(LM_ID_NEWLM, file, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND);
 | 
| 2 | int(*init)() = dlsym(plugin, "plugin_init");
 | 
| 3 | if(init && init()){
 | 
| 4 |   fprintf(stderr, "plugin_init() failed\n");
 | 
| 5 |   return -1;
 | 
| 6 | }
 | 
Im Plugin hab ich dann im Grunde genommen nur:
| 1 | #include <stdio.h>
 | 
| 2 | #include <atspi/atspi.h>
 | 
| 3 | 
 | 
| 4 | int plugin_init(){
 | 
| 5 |   puts("1");
 | 
| 6 |   atspi_init(); // <-- Hier crasht es...
 | 
| 7 |   puts("2");
 | 
| 8 | }
 | 
| 9 | 
 | 
| 10 | void plugin_cleanup(){
 | 
| 11 |   atspi_exit();
 | 
| 12 | }
 | 
libatspi-2 ist gegen mein Plugin geklinkt, es gibt keine nicht 
aufgelösten Symbole (ich linke die library mit -Wl,--no-undefined). Ich 
weiss nur, dass es irgendwo in glib crasht, weil es versucht, auf die 0 
page zuzugreifen, aber nicht, warum es das tut oder was ich ändern 
muss...
Wenn ich statt "atspi_init();" versuche "g_main_loop_new(NULL, false);" 
aufzurufen, crasht es auch. Ich stehe hier gerade etwas auf dem 
Schlauch. Weiss zufällig jemand, woran das liegen könnte, was ich anders 
machen müsste, oder was ich noch versuchen könnte?