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?