[archimedes] Re: [10] Wir basteln uns ein !Boot

  • From: Markus Huber <info@xxxxxxxxxxxxxx>
  • To: archimedes@xxxxxxxxxxxxx
  • Date: Thu, 21 Apr 2016 23:50:37 +0200 (BST)

!Sources
~~~~~~~~
Nach !System folgen die !Sources. In !Sources.!Run ist eine der
"versteckten" Kompatibilitäten zum originalen !Boot eingebaut. Die
beiden Systemvariablen BootResources$Dir und BootResources$Path mit
all den darunter befindlichen Daten sind in !Sources integriert. Bir mir
sind das nur die Monitor-Definition-Files und Tiles, die Backdrops...

!Sources.Configure
!Sources.Configure.Monitors
!Sources.Configure.Tiles


Set IfDesk <124>
Set IfRun  <124>
|---------------
If "%0" = "Desk" Then Set IfDesk <32>
If "%0" = ""     Then Set IfRun  <32>
|------------------------------------
IfSame Same <Obey$Dir> <Sources$Dir>
If Same Then Set IfSame <32> Else Set IfSame <124>
|-------------------------------------------------
Do <IfRun><IfSame> Filer_OpenDirs |<Sources$Dir>
Do <IfRun><IfSame> Obey
|----------------------
If Same=0 Then Set Sources$Dir <Obey$Dir>
If Same=0 Then Set BootResources$Dir <Sources$Dir>
If Same=0 Then Set BootResources$Path <Sources$Dir>.
|---------------------------------------------------
Do <IfRun> Error !Sources was moved but never installed twice
|------------------------------------------------------------
Do <IfDesk> Repeat Filer_Boot <Sources$Dir>.Apps -applications -tasks
| *Repeat must end with an newline

Der letzte *Do <IfDesk> ... wird ja nur ausgeführt, wenn !Sources von
!Boot.Desk mit dem Parameter "Desk" gestartet wurde. Im Verzeichnis
!Sources.Apps befinden sich alle Sourcen die allgemein für Apps zur
Verfügung stehen. All der "unsichtbare" Bibliotheken-Kram im
Hintergrund. Bei mir ist das:

!BasLib      -> Eigenentwicklung einer Basic Library
!CCShared    -> für Computer Concepts Apps
!Flash       -> sollte ich wohl mal rauswerfen
                funktionierte da jemals was sinnvolles mit?
!Mail        -> The command line GMail
                habe ich mal verwendet um mit der Datenbank Squirrel
                automatisch E-Mails an Gruppen zu verschicken
!Manuals     -> alle StrongHelp Manuals
                theoretisch auch für andere Hilfesysteme ein zentraler Ort
!OreganRes   -> Oregano Browser (ob das hier wirklich hingehört?)
!PlayIt      -> PlayIt is a disc-based engine for playing sound samples.
!RealAudio   -> sollte ich wohl mal rauswerfen
                das hat aber tatsächlich mal funktioniert
!SerialDev   -> Klassiker: Hugo Fiennes, Rev 10, 11th August 1994
!SharedLibs  -> RISC OS Dynamic Linking and Shared Libraries
                kamen mit dem GCC Krempel neu hier an
!TWAIN       -> Klassiker: David Pilling
                habe schon ewig nix mehr mit RISC OS gescannt

All diese Sourcen bringen ihre eigenen Innereien mit und werden mit
dem *Repeat Filer_Boot ... installiert.

!Sounds
~~~~~~~
Ähnlich wie !Sources sind es hier ein paar wenige Armadeus Sound
Dateien in !Sounds.Aramdeus und viele Sound Module in !Sounds.Modules
die bereit gestellt werden.

!Transfer
~~~~~~~~~
Diese Pseudo-App dient als zentrale Stelle für Input/Outputs im
weitesten Sinne. Es nervte früher nie genau zu wissen, bzw. viele Orte
zu haben wo folgende Daten landen:

ArcFax   -> eingehende und abgehende Faxe
            das hat mit einem Modem mal richtig gut funktioniert
Connect  -> I/O für das gute Programm !Connector
Email    -> was hierdrin stattfindet ist klar oder?
Printout -> Druckertreiber legen hier die Dateien ab

!Trace
~~~~~~
!Trace is a storage area used by applications to store tracefiles.
!Trace cannot be used on a write protected floppy disc or in a read-only
location on a network.

!SysLog
~~~~~~~
!SysLog is a storage area used by applications to store logfiles.
!SysLog cannot be used on a write protected floppy disc or in a
read-only location on a network.

Hier habe ich dem SysLog Module von DoggySoft eine Pseudo-App spendiert.
Funktioniert tadellos über viele Aufgaben hinweg.

!Sprites
~~~~~~~~
Endlich wieder eine "neue" und zentrale Funktion dieses !Boot-Systems:
DirectoryCommand

If "%0" = "" Then Set IfRun <32> Else Set IfRun <124>
|----------------------------------------------------
IfSame Same <Obey$Dir> <Sprites$Dir>
If Same Then Set IfSame <32> Else Set IfSame <124>
|-------------------------------------------------
Do <IfRun><IfSame> Filer_OpenDir |<Sprites$Dir>.Public
Do <IfRun><IfSame> Filer_OpenDir |<Sprites$Dir>.<User$Filename>
Do <IfRun><IfSame> Obey
|----------------------
Set Sprites$Dir <Obey$Dir>
EnsurePath <Sprites$Dir>.<User$Filename>.
Do DirectoryCommand <Boot$Verbose>
<Sprites$Dir>.<User$Filename>.,<Sprites$Dir>.Public.

*Help DirectoryCommand
==> Help on keyword DirectoryCommand
*DirectoryCommand adds the <directory> to each path of the given <path>
and searches in the resulting directories for directories. The name of
each directory found is used as the command which is performed to each
object inside the particular directory. If an obeyfile with the filename
!Command is placed in a directory, this obeyfile is executed for each
object in that directory instead.
Parameter in !Command:
0% Object
The meaning of the keyword: (abbreviation possible eg. -v for -verbose)
-verbose  causes each line to be echoed before execution
Syntax: *DirectoryCommand [[-verbose] <path> [<directory>]]

Hört sich kompliziert an? Ist es gar nicht. Auf deutsch die einfachste
Anwendung, gleich so wie hier in !Sprites verwendet:

Wir machen ein Verzeichnis mit dem Namen "IconSprites".
Wir kopieren beliebig viele Sprite Dateien in dieses Verzeichnis.
Wir geben den Befehl:

DirectoryCommand <Verzeichnis>.

Und was passiert? DirectoryCommand nimmt den Namen des
Verzeichnisses, als Befehl/Kommando und führt jede Datei in diesem
Verzeichnis mit diesem Kommando aus.

*Help IconSprites
==> Help on keyword IconSprites
*IconSprites loads a sprite file into the Wimp's common sprite pool
Syntax: *IconSprites <filename>

Beispiel: Die vier Sprite Dateien in IconSprites

<Irgendwo$Dir>.IconSprites.Apps
<Irgendwo$Dir>.IconSprites.Files
<Irgendwo$Dir>.IconSprites.Pinboard
<Irgendwo$Dir>.IconSprites.System

Kommando: *DirectoryCommand <Irgendwo$Dir>.

Geben folgende tatsächlich ausgeführten CLI Kommandos:

*IconSprites <Irgendwo$Dir>.IconSprites.Apps
*IconSprites <Irgendwo$Dir>.IconSprites.Files
*IconSprites <Irgendwo$Dir>.IconSprites.Pinboard
*IconSprites <Irgendwo$Dir>.IconSprites.System

So wird das Hinzufügen oder Wegnehmen - in dem Fall von IconSprites -
zum Plazieren oder Entfernen von Dateien in einem Verzeichnis. Und was
mit den darin liegenden Dateien passiert erklärt sich von selbst! Der
Dateiname ist das Kommando.

Nun funktioniert es jederzeit beliebig viele Verzeichnisse, allesamt
direkte CLI Kommandos, in einem Verzeichnis zu "sammeln", in diesen
Verzeichnissen beliebig viele Dateien zu plazieren, die mit einem
einzigen Aufruf allesamt ausgeführt werden.

Also fügen wir den IconSprites einfach noch ToolSprites hinzu.
ToolSprites funktioniert wie IconSprites, definiert aber das Aussehen
der RISC OS Fensterrahmen.

Help ToolSprites
==> Help on keyword ToolSprites
*ToolSprites loads a sprite file to use as window borders
Syntax: *ToolSprites <filename>

<Irgendwo$Dir>.ToolSprites.Tools

Selbiges Kommando: *DirectoryCommand <Irgendwo$Dir>.

Geben nun folgende tatsächlich ausgeführten CLI Kommandos:

*IconSprites <Irgendwo$Dir>.IconSprites.Apps
*IconSprites <Irgendwo$Dir>.IconSprites.Files
*IconSprites <Irgendwo$Dir>.IconSprites.Pinboard
*IconSprites <Irgendwo$Dir>.IconSprites.System
*ToolSprites <Irgendwo$Dir>.ToolSprites.Tools

So weit verstanden? Jetzt kommts noch ne riesen Ecke funktionaler! Denn
wenn *DirectoryCommand in dem Kommando-Verzeichnis eine Obey Datei mit
dem Namen "!Command" findet, dann wird jede andere Datei in diesem
Verzeichnis, nicht mehr mit dem Verzeichnissnamen aufgerufen, sondern
für jede Datei wird die Obey Datei aufgerufen und als Parameter die
Datei übergeben.

Plazieren wir, nur so als Beispiel, die
<Irgendwo$Dir>.IconSprites.!Command Obey Datei mit folgendem Inhalt:

IconSprites %0
Delete %0

In dem obigen Verzeichnis "IconSprites" (dessen Name nun keine Rolle
mehr spielt), dann rufen wir wieder identisch auf:

*DirectoryCommand <Irgendwo$Dir>.

Wird daraus:

*IconSprites <Irgendwo$Dir>.IconSprites.Apps
*Delete <Irgendwo$Dir>.IconSprites.Apps
*IconSprites <Irgendwo$Dir>.IconSprites.Files
*Delete <Irgendwo$Dir>.IconSprites.Files
*IconSprites <Irgendwo$Dir>.IconSprites.Pinboard
*Delete <Irgendwo$Dir>.IconSprites.Pinboard
*IconSprites <Irgendwo$Dir>.IconSprites.System
*Delete <Irgendwo$Dir>.IconSprites.System
*ToolSprites <Irgendwo$Dir>.ToolSprites.Tools

Nur die <Irgendwo$Dir>.ToolSprites.Tools bleibt erhalten weil im
Verzeichnis "ToolSprites" ist die obige !Command Datei ja nicht.

Warum ist es eigentlich ein Pfad der da angegeben wird? Nun ganz
einfach, es werden alle Pfade mit einem Aufruf ausgeführt. Der
Nutzen wird wieder an den Sprites erkennbar. Zur Erinnerung:

Do DirectoryCommand
<Boot$Verbose> <Sprites$Dir>.<User$Filename>.,<Sprites$Dir>.Public.

Die zwei Pfade sind:
<Sprites$Dir>.<User$Filename>.,<Sprites$Dir>.Public.

Real also:
!Boot.Boot.!Sprites.Markus
!Boot.Boot.!Sprites.Public

Mit den Verzeichnissen:

!Boot.Boot.!Sprites.Markus.IconSprites
!Boot.Boot.!Sprites.Markus.ToolSprites
!Boot.Boot.!Sprites.Public.IconSprites

Alle drei gefüllt mit Sprite Dateien die allesamt mit einem
einzigen Aufruf korrekt angemeldet werden.

Da ich mit einem Modul das Anmelden von Sprites untersage bzw. abhängig
von einer Systemvariable erlaube, habe ich in jedem der drei
Verzeichnisse eine !Command Datei mit folgendem Inhalt:

Set AddSprites$Control Off
IconSprites %0
Set AddSprites$Control On

Bzw. bei den ToolSprites eben

Set AddSprites$Control Off
ToolSprites %0
Set AddSprites$Control On

So kann mir kein Programm von außen meine Icon- und ToolSprites
überbügeln.

Und nun noch zum letzten Kniff den DirectoryCommand ermöglicht:
Syntax: *DirectoryCommand [[-verbose] <path> [<directory>]]

Das <directory> wird jedem Pfad angefügt. Damit kann man z.B. innerhalb
der MultiUser-Funktionalität noch mal Gruppierungen einführen. Ich lass
das mal weg ausfühlrich zu erklären, das ist theoretisch z.B. für
mehrere Gruppierungen wie z.B. jeweils ein Set für den Tag und in der
Nacht ein anderes.

Ich finde, selbst wenn dieses !Boot nicht interessiert, so ist
*DirectoryCommand etwas sehr feines mit zahlreichen
Einsatzmöglichkeiten. Und jederzeit auf jedem RISC OS auc
ohne dieses !Boot einsetzbar.

--
Markus

.


Other related posts:

  • » [archimedes] Re: [10] Wir basteln uns ein !Boot - Markus Huber