Forum: PC-Programmierung Wie libatspi-2 / glib / gobject in library/plugin initialisieren?


von DPA (Gast)


Lesenswert?

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?

von Daniel A. (daniel-a)


Lesenswert?

Ich hab jetzt nach weiterem Debuggen gemerkt, dass es weniger weit 
kommt, als ich zunächst dachte. Crasht gleich in beim dlmopen in 
libglib... Asan hat mir da nichts Sinvolles geliefert, aber von valgrind 
hab ich nen brauchbaren stack trace bekommen:
1
==28054== Invalid read of size 8
2
==28054==    at 0x5EF29D0: g_slice_alloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
3
==28054==    by 0x5EC2D2D: g_hash_table_new_full (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
4
==28054==    by 0x5EE4EAA: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
5
==28054==    by 0x400F379: call_init.part.0 (dl-init.c:72)
6
==28054==    by 0x400F475: call_init (dl-init.c:118)
7
==28054==    by 0x400F475: _dl_init (dl-init.c:119)
8
==28054==    by 0x40132D2: dl_open_worker (dl-open.c:517)
9
==28054==    by 0x5120B2E: _dl_catch_exception (dl-error-skeleton.c:196)
10
==28054==    by 0x4012BB9: _dl_open (dl-open.c:599)
11
==28054==    by 0x4FE6D2F: dlmopen_doit (dlmopen.c:71)
12
==28054==    by 0x5120B2E: _dl_catch_exception (dl-error-skeleton.c:196)
13
==28054==    by 0x5120BBE: _dl_catch_error (dl-error-skeleton.c:215)
14
==28054==    by 0x4FE6974: _dlerror_run (dlerror.c:163)
15
==28054==  Address 0x50 is not stack'd, malloc'd or (recently) free'd

Den Ansatz mit shared libraries für die Plugins kann ich also vergessen. 
Jetzt muss ich die wohl in eigene Programme packen, das macht alles viel 
komplizierter... Verfluchte libglib...

von DPA (Gast)


Lesenswert?

Jetzt mach ich das AT-SPI zeug in einer separaten Anwendung. Ich bin nun 
aber auf das nächste unlösbare Problem gestossen. Mein Window manager 
ist für mein Smartphone, das kann ich an eine docking station 
anschliessen, und hab dann nen richtigen Bildschirm und ne Tastatur. Die 
Bildschirmtastatur will ich nun vorerst nur auf dem Smartphonebildschirm 
anzeigen, und nur, wenn in einer Anwendung auf dessen Bildschirm ein 
Editierbares feld ausgewählt hat.

Das Problem ist nun, Ich kenne zwar alle X11 Fenster, und ich weiss, 
wann ein editierbares AtspiAccessible den Focus bekommt, aber es scheint 
nicht möglich zu sein, herauszufinden, zu welchem X11 Fenster das 
AtspiAccessible denn nun gehört. Ich konnte noch nichteinmal einen 
zuverlässigen Weg finden, das AtspiAccessible einem xrandr Output 
(Bildschirm) zuzuordnen. Eins von beiden muss ich aber zwingend 
irgendwie herausfinden, sonst kann ich nicht herausfinden, auf welchen 
Bildschirmen ich welches Keyboard ein/ausblenden muss...

https://developer.gnome.org/libatspi/stable/AtspiAccessible.html

Hat jemand eine Idee, was ich da machen könnte?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.