Es scheint mir, in diesem Commit werden mehrere verschiedene Sachen geaendert, die auch so nicht in der Beschreibung erklaert werden.
Ja, mit den Beschreibungen tue ich mich recht schwer. Das ist für mich Neuland. Prinzipiell finde ich das gut, und bemühe mich auch, damit besser zu werden.
OK, ich werde mal versuchen, ein wenig Licht ins Dunkel zu bringen, warum ich diese beiden Commits in der ein oder anderen Form für notwendig halte.
Die Ausgangssituation war, das das erste DisplayChannel beim Start des VDR als Workaround für CreateCacheDelayed() unterdrückt wurde. Das sollte mit dem Commit 990d88480c9392da73438d44d1a82b1290e307ef behoben werden. Im Nachgang hat sich dann herausgestellt, das das nicht immer, und zwar in Abhängigkeit vom Theme, funktioniert hat.
Aus meiner Sicht gehört das CreateCacheDelayed() in nopacity.c. Nach weiteren Analysen hat sich dann gezeigt, das man das aber nicht einfach im Constructor von cNopacity unterbringen kann, und das war sicher auch der Grund dafür das CreateCacheDelayed() vom CreateCache() zu trennen, weil der Constructor zu zeitig beim Start vom VDR aufgerufen wird. Zu diesem Zeitpunkt sind die Daten, die dafür gebraucht werden, das Theme, noch nicht bekannt. Auch kann man das nicht z.B. in cSkinDisplayChannel *cNopacity::DisplayChannel unterbringen, das funktioniert auch nur abhängig vom Theme.
Wo also das CreateCacheDelayed() unterbringen? Da erschien nun die Funktion cNopacity::ReloadCaches() prädestiniert dafür, da die ja sowieso nach Ändern der Geometrie oder des Theme den Cache neu anlegt. Der Ausrutscher mit dem Show() war hier leider ein Denkfehler.
Das Problem ist nun aber, das cNopacity::ReloadCaches(void) beim ersten Start des Skin gar nicht aufgerufen wird, weil im geometrymanager die Koordinaten bereits im Constructor gesetzt werden und damit die Funktion GeometryChanged(void) false zurückliefert. Die Änderung im geometrymanager passt das so an, das im Constructor jetzt die Werte mit 0 initialisiert werden, und damit jetzt auch beim ersten Start cNopacity::ReloadCaches(void) durchlaufen wird und den ImageCache korrekt initialisiert. Der Commit "Eliminate cGeometryManager::SetOSDSize" für sich alleine, macht natürlich wenig Sinn und gehört in den letzten Commit mit rein.
CreateCacheDelayed() vom CreateCache() sind somit in cNopacity überflüssig, weil die dann über imgCache->Reload() aufgerufen werden. Dann habe ich noch den Rest aus dem Constructor von cNopacity in cNopacity::ReloadCaches(void) untergebracht, weil das sowieso dort schon vorhanden war oder da mit hin passt.
Die Änderung im fontmanager war dann nötig, weil beim ersten Aufruf von cNopacity::ReloadCaches(void) die fonts noch nicht definiert waren und es beim fontManager->DeleteFonts() zu einem segfault kam. Dazu habe ich in fontmanager.h die ganzen Fonts mit NULL initilisiert, weil ich ursprünglich die einzelnen Fonts in cFontManager::DeleteFonts* in if () einbauen wollte, habe mich dann aber entschieden hier das DELETENULL() zu verwenden.
Diese ganzen Änderungen führen im Endeffekt dazu, dass über cNopacity::ReloadCaches(void) nur beim ersten Aufrufen des Skins oder bei Änderungen der Geometrie bzw. des Theme die Caches korrekt initialisiert werden.
Im Nachgang schwebten mir dann noch ein paar weitere Anpassungen vor:
- Zusammenfassen von CreateCacheDelayed() und CreateCache(), hier ist ein separates Handling nun nicht mehr nötig.
- Zusammenfassen von cGeometryManager::SetGeometry() und den ganzen SetDisplay*, weil die nur dort verwendet werden.
- Zusammenfassen von DeleteFonts() und SetFonts(), das habe ich mir aber noch nicht angesehen.
Ich schaue mal, wie ich diese beiden Commits noch etwas Kleinteiliger anlegen kann.
Grüße
kamel5