application folder für PNDs ...


F_Slim

IDDQD
Joined
Aug 25, 2010
Messages
1,430
Age
44
Location
Germany
Hallo,

ich hab' mal 'ne Frage. Was ich bei .PNDs noch nicht verstanden habe ist der application folder.
Laut wiki muß ich den auf der SD-Karte per Skript erstellen ... und dann wird der automatisch genutzt? Also "weiß" die Anwendung von dem application folder? (Woher? Also muß der einen bestimmten Namen haben, und wenn ja welchen der zig Bezeichnungen die unique oder nicht unique sein müssen ist es dann?)

Beispiel: ein Programm besteht nur aus einer Executable. Nach beenden erstellt es im gleichen Verzeichnis automatisch eine config-Datei.
In der PND muß ich also das Programm über ein shell-script starten (das definiere ich glaube ich in der .xml, welche Datei auszuführen ist?), welches vorher (falls nötig) den Ordner erstellt. Bei richtigem Ordner-Namen schreibt die Anwendung die config-Datei dann automatisch in dieses Verzeichniss, anstatt zu versuchen ins PND zu schreiben (was ja nicht geht)?
Oder muß ich in den source-code gehen und explizit den Pfad anpassen, wo hingeschrieben werden soll?

Edit: Noch 'ne Frage: welche Einschränkungen gelten für das Icon? PNG gibt's glaube ich verschiedene Formate/Kodierungen, vor allem wären aber die zulässigen Maße und Auflösung wichtig!
 
F_Slim said:
Hallo,

ich hab' mal 'ne Frage. Was ich bei .PNDs noch nicht verstanden habe ist der application folder.
Laut wiki muß ich den auf der SD-Karte per Skript erstellen ... und dann wird der automatisch genutzt? Also "weiß" die Anwendung von dem application folder? (Woher? Also muß der einen bestimmten Namen haben, und wenn ja welchen der zig Bezeichnungen die unique oder nicht unique sein müssen ist es dann?)

Beispiel: ein Programm besteht nur aus einer Executable. Nach beenden erstellt es im gleichen Verzeichnis automatisch eine config-Datei.
In der PND muß ich also das Programm über ein shell-script starten (das definiere ich glaube ich in der .xml, welche Datei auszuführen ist?), welches vorher (falls nötig) den Ordner erstellt. Bei richtigem Ordner-Namen schreibt die Anwendung die config-Datei dann automatisch in dieses Verzeichniss, anstatt zu versuchen ins PND zu schreiben (was ja nicht geht)?
Oder muß ich in den source-code gehen und explizit den Pfad anpassen, wo hingeschrieben werden soll?

Edit: Noch 'ne Frage: welche Einschränkungen gelten für das Icon? PNG gibt's glaube ich verschiedene Formate/Kodierungen, vor allem wären aber die zulässigen Maße und Auflösung wichtig!
Also erstmal musst du nix erstellen. PNDs arbeiten als squashfs. Der ordner in "appdata" wird automatisch erstellt basierend auf der application id bzw der appdata definition im PXML.xml. Ich erkläre das alles mal am besten anhand eines kleinen Beispiels:

Man nehme eine normale Linux Anwendung, die ihre Daten wie gewohnt nach $HOME/.programm schreibt. Dort wird automatisch beim beenden alles relevante wie Einstellungen oder sonstwas hingeschrieben. Außerdem braucht die Anwendung noch irgendwelche Daten, die du direkt im PND mitliefern kannst, da nur lesend drauf zugegriffen wird.
Wenn du nun im PXML.xml den exec block direkt auf die Binärdatei zeigen lässt passiert folgendes:
Alles, was du an Daten von '.' (also aktuellem Ordner) aus liest kommt entweder auf dem PND selbst, oder dem dem Appdata Ordner. Das ist eine Magie, die squasfs automatisch für dich übernimmt.
Wenn du nun etwas schreiben willst, wird natürlich versucht eine evtl in einem der beiden Ordnern vorhandene Datei gleichen namens zu überschreiben. Von den rechnten her kann aber nur in den appdata Ordner geschrieben werden, das PND selbst ist "readonly". Wenn also in eine Datei geschrieben werden soll, die im PND selbst vorhanden ist, geht das erstmal nicht. *NUR* um das zu verhindern ist letztlich ein Startskript sinnvoll/nötig. Das gilt natürlich auch, wenn man eine Default config mitliefern will.
Daten, die nach $HOME geschrieben werden, würden auf dem NAND landen, was nicht gerade die nette art ist. Hier ist ein weiterer Anwendungsfall vom Startskript. Man setzt in diesem einfach die HOME Variable auf den aktuellen Ordner.

Um das Beispiel noch konkreter zu machen: Bei Wesnoth liefere ich eine Default config mit, die z.b. die Auflösung setzt. Da diese innerhalb vom pnd nicht mit eigenen Einstellungen überschrieben werden kann, kopiere ich mir die Datei dahin, wo das Spiel später die config Datei erwartet, im PND selbst liegt sie entsprechend mit anderem Namen (wichtig!). Außerdem will ich das Spiel mit anderem $HOME Ordner starten und ihm einige Parameter mitgeben. Das resultierende Startscript sieht dann so aus:
Code:
#!/bin/sh

#copy over a default preferences file
mkdir --parents ./userdata/
cp --no-clobber preferences.default ./userdata/preferences

HOME="./" ./bin/wesnoth --config-dir userdata --fullscreen --smallgui -r 800x480 .
Es wird, falls noch nicht vorhanden, der *Unterordner* erstellt, in dem die configs vom Programm erwartet werden (/media/SDKARTENNAME/pandora/appdata/wesnoth-1.9 wird automatisch beim starten der PND generiert!). Dort wird die config Datei hinkopiert, falls noch keine vorhanden ist. Die echte Binärdatei liegt in bin/ im PND und wird einfach aufgerufen. Außerdem werden einige extra Parameter gesetzt.

Die zugehörige (und mit dem neuen PXML_schema.xsd validierbare!) PXML.xml Datei sieht dann wie folgt aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<PXML xmlns="http://openpandora.org/namespaces/PXML">
  <application id="wesnoth-1.9">
    <exec command="run.sh" x11="req"/>
    <title lang="en_US">Battle For Wesnoth 1.9.x</title>
    <author name="Packaged by Ivanovic" website="http://www.wesnoth.org"/>
    <version major="1" minor="9" release="4" build="2"/>
    <description lang="en_US">The Battle for Wesnoth is a Free, turn-based tactical strategy game with a high fantasy theme, featuring both single-player, and online/hotseat multiplayer combat. Fight a desperate battle to reclaim the throne of Wesnoth, or take hand in any number of other adventures...</description>
    <icon src="wesnoth-icon.png"/>
    <previewpics>
      <pic src="wesnoth-mainscreen.png"/>
    </previewpics>
    <info name="Battle for Wesnoth 1.9.x manual" type="text/html" src="doc/manual.en.html"/>
    <categories>
      <category name="Game">
        <subcategory name="StrategyGame"/>
      </category>
    </categories>
  </application>
</PXML>
Das klärt hoffentlich deine grundlegenden Fragen. In Sachen Icon: nimm einfach nen "hinreichend kleines" PNG Bild. Z.B. sollte ein 64x64 großes PNG wunderbar gehen und mach dir mal keine Sorgen ums Format. PNG ist da hinreichend strikt spezifiziert, dass es nicht zu Problemen kommen sollte.
 
Nein, Du musst Appdata nicht selber erstellen.

Du machst folgendes:

SD-Karte wie folgt:

/pandora/menu/
/pandora/apps/
/pandora/desktop/

Dort legst Du die PNDs rein.
Wenn Du sie in /menu legst, erscheinen sie nur im Menu. Legst Du sie in /desktop, erscheinen sie nur auf dem Desktop.
Legst Du sie in /apps, erscheinen sie im Menu und im Desktop. MiniMenu zeigt alle an.

Wenn Du jetzt eine PND startest, wird automatisch ein neuer Ordner angelegt.
Startest Du z.B. TESTFile.PND, würde dieses evtl. den Ordner /pandora/appdata/testfile/ erstellen, in welches es seine Config-Dateien legt.
(in /appdata/ liegen also alle Configs drin, der Name des Unterverzeichnisses ist im PND angegeben).

Startest Du dann z.B. Opera.PND, würde dieses /pandora/appdata/opera/ anlegen und die Configs drin speichern, usw.

Wenn Du irgendwann ein Programm in den Urzustand versetzen willst, musst Du nur dessen Ordner in appdata löschen.
Willst Du nur ein Programm löschen, die Einstellungen aber beibehalten, musst Du nur die PND löschen. Kopierst Du sie später wieder auf die Karte, bleiben Dir alle Einstellungen erhalten.

Der /appdata/<appname>/ Ordner ist zudem ein Overlay mit höherer Priorität.
Nimm z.B. an, ein Programm hat ein Startscript im PND namens startemich.sh, welches beim Start ausgeführt wird.
Möchtest Du dieses Script selber anpassen, legst Du die Datei /appdata/<appname>/startemich.sh an. Wenn Du die PND startest, wird dann dieses Script verwendet, da es eine höhere Priorität besitzt.
Gleiches funktioniert z.B. auch für Grafiken, etc. Willst Du bei SuperTux die Grafiken ersetzen, kopierst Du die geänderten in dessen appdata-Verzeichnis.
Willst Du den Urzustand wieder herstellen, löscht Du sie dort einfach wieder raus.
 
Ah, ok. Jetzt ist mir einiges klarer geworden. Vielen Dank!
Ist ja doch deutlich einfacher als ich dachte. Echt ein richtig gutes System!

Kann man nicht auch in der PXML.xml die Parameter übergeben (z.B. <exec command="start.bin -gui">)?
 
F_Slim said:
Ah, ok. Jetzt ist mir einiges klarer geworden. Vielen Dank!
Ist ja doch deutlich einfacher als ich dachte. Echt ein richtig gutes System!

Kann man nicht auch in der PXML.xml die Parameter übergeben (z.B. <exec command="start.bin -gui">)?
Ja, man kann parameter auch übergeben, aber wie das geht, dazu schau dir am besten mal die Specs an:
http://pandorawiki.org/PXML_specification
 
F_Slim said:
Kann man nicht auch in der PXML.xml die Parameter übergeben (z.B. <exec command="start.bin -gui">)?
Für dauerhafte PMX Modifikationen war/ist die Override Funktion mit Hilfe von *.ovr Dateien gedacht. Ich warte noch auf meine Pandora, aber laut Wiki könnte
Override PNDs
PXML_overrides
für Dich interessant sein.
 
EvilDragon said:
Der /appdata/<appname>/ Ordner ist zudem ein Overlay mit höherer Priorität.
Nimm z.B. an, ein Programm hat ein Startscript im PND namens startemich.sh, welches beim Start ausgeführt wird.
Möchtest Du dieses Script selber anpassen, legst Du die Datei /appdata/<appname>/startemich.sh an. Wenn Du die PND startest, wird dann dieses Script verwendet, da es eine höhere Priorität besitzt.
Gleiches funktioniert z.B. auch für Grafiken, etc. Willst Du bei SuperTux die Grafiken ersetzen, kopierst Du die geänderten in dessen appdata-Verzeichnis.
Willst Du den Urzustand wieder herstellen, löscht Du sie dort einfach wieder raus.
Cool, danke das wusste ich auch noch nicht. Weiß jemand, wie man PNDs am einfachste (wenn möglich auf der Pandora) entpackt, um den Inhalt zu sehen, den man "überschreiben" kann?
 
Du kannst es auf der Pandora einfach mounten :)
Das geht mit pnd_run

Am PC (Linux) geht das auch simpel:

mount -o loop /pfad/zur/pnd.pnd /pfad/zum/mountpoint
 
SebbiUltimate said:
Und auf Windows (ja ich weiß, ihr hasst es :wub: ) ?
Hmm, überhaupt nicht oder nur mit riesen Aufwand?

Wie wär's mit einer Linux VM?
 
Ah, ich hab grad nur an squashfs-Dateien gedacht, und als ich kurz nach "squashfs windows" gesucht habe, habe ich nichts gefunden.
 
Back
Top