IconDecorMasterObject

デスクトップピクチャの制御機能、画像の表示、Speech Managerによるテキスト読み上げなど,様々なユーザーインターフェースを担うライブラリです。ここでは実装された順に様々な機能とそのスクリプティングの概念を示します。

Decor制御機能とImageBinデータ形式

そもそもはDecorというデスクトップに画像を表示するためのスクリプトを作成していました。その過程で,DecorMasterというスクリプトが作られました。このスクリプトは画像をドロップするとDecorに表示させ,その表示パラメータも設定できるものでした。Decorはその表示パラメータをAppleScriptとの間でやりとりすることができ,漢字Talk7.5のもとではAppleScriptからの画像表示の方法としてはベストのように思われました。このDecorを用いて,次のようなデータ形式をImageBinフォーマットとして決定しました。
DecorMasterObjが採用している画像フォーマットImageBinはリスト形式で,
{(画像のクリエータタイプ文字列), (画像データ文字列), (Decorのパラメータ設定一式)}
となっています。Decorのパラメータは
tell application "Decor Daemon" to get all settings
で得ることができます。その内容は以下のようになっています。
{active:true, automatic change:false, time interval:330, wait until idle:true, idle period:10, picking:at random, scaling:true, keep proportions:true, scale down only:false, dithering:true, use border color:true, color:{65535, 65535, 65535}, tiling:false, scale and crop:false, animate cursor:false, error handling:ignore, reaction to display changes:reload picture, image spec:file "Macintosh HD:システムフォルダ:初期設定:DecorMaster Image"}
これはDecorのインストールされていない環境下では以下のように表現されます。
{ヌclass actvネ:true, ヌclass achgネ:false, ヌclass Itvlネ:330, ヌclass pwIdネ:true, ヌclass pwISネ:10, ヌclass pickネ:ヌconstant ****arndネ, ヌclass scalネ:true, ヌclass asptネ:true, ヌclass downネ:false, ヌclass dthrネ:true, ヌclass cstmネ:true, color:{65535, 65535, 65535}, ヌclass tileネ:false, ヌclass cropネ:false, ヌclass pVBLネ:false, ヌclass pErHネ:ヌconstant ****Eignネ, ヌclass dpthネ:ヌconstant ****rlpcネ, ヌclass ispcネ:file "Macintosh HD:システムフォルダ:初期設定:DecorMaster Image"}
当初はこのフォーマットはアプリケーションDecorChangerの内部でのみ利用されていました。その内部では以下のような内部ルーチンが定義されました。

returnFilePath()
現在Decorで表示している画像のファイルパスを返す。
readImage(FilePath)
指定したファイルパスの画像をImageBinフォーマットで読み込む。returnFilePathイベントと組み合わることによりDecorで現在表示している画像をそのままパラメータごとImageBinフォーマットにすることができる。
dispImage(ImageBin)
ImageBinフォーマットの画像データを渡すことにより,その画像をDecorで表示する。
hideOthers()
デスクトップに表示している画像を見やすくするため,実行しているアプリケーション以外のすべてのアプリケーションのウインドウを隠す。アプリケーションメニューで「他を隠す」を選んだのと同じ。

画像データベース機能

デスクトップピクチャを自由に制御できるようになったため、これをAppleScript用の画像表示エンジンに利用することにしました。また,DecorMaster Objectは表示するための画像をあらかじめ内部に保持するデータベース機能も持ちました。データベースを操作するために以下のルーチンが定義され、DecorMasterからDecor制御機能のみを切り出してCyberHandlerObjからも利用できるようにしたスクリプトがDecorMaster Objectでした。

returnNum()
データベース内の画像の枚数を調べる。
returnID(ImageID)
指定したIDの画像を取得する。
dispImage(ImageID)
データベース内の対応するID番号を持った画像を表示する。
addImage(ImageBin)
画像をデータベースの末尾に追加する。
deleteID(ImageID)
指定したIDの画像をデータベースから削除する。

すなわち,データベース内の画像にはすべてIDが割り当てられ,そのIDを整数で指定することでデータベース内の操作を行うことができます。dispImage(ImageID)ルーチンは、与えられたパラメータの内容がリストであればImageBinとして扱いそのまま表示し,パラメータの内容が整数であればImageIDとしてそのIDに対応した番号の画像をデータベースから引き出して表示します。
データベースの画像そのものはDecorMaster Object内部に保持され、DecorMaster Objectは単体のファイルとして機能拡張フォルダ内に保存されるようになりました。DecorMasterはその内部のデータベースを書き換えるためのツールとなりました。

CyberHandlerObjの拡張

さて,DecorMasterObjが画像データベースとそれを表示するルーチンを備えたことで,他のスクリプトからそれを呼び出して簡単に画像を表示することができるようになりました。そこで CyberHandler Objectは以下のような機能を備えました。
try
    -- Script to be done
on error errStr number errNum
    errorObj("Error in reading file.", errStr, errNum)
end try
このerrorObjルーチン内で,CyberHandlerObjはDecorMasterObjのデータベースのID=2の画像を表示します。あらかじめ画像をデータベースに登録した状態のDecorMasterObjが限定配布されました。これが DecorMasterObject with MAGI Schemeと呼ばれる拡張されたインターフェースです。
この際に問題となるのは,元の画像への復帰でした。スクリプトが勝手にデスクトップの画像を書き換えた後,直ちにもとの画像に戻す機能が必要になったわけです。
readImageルーチンを使えば現在表示中の画像を丸ごと取得することは可能なので,それを広域変数にでも入れておいて再び DecorMasterObjに戻すことは可能でした。しかしこれでは,画像ファイルの大きさが大きかった場合に CyberHandlerObjを組み込んだアプリケーションが大量のメモリを消費してしまいます。
そこで,次のようなルーチンが DecorMasterObjに組み込まれました。

storeSet()
現在の設定を記憶する。
dispTempImage(ImageID)
データベース内の対応するID番号を持った画像を一時的に表示する。
loadSet()
記憶した以前の状態に復帰する。

storeSet および loadSet の各命令では画像データそのものは扱わないため,メモリ消費はそれほど大きくありません。
これらの命令の内容は DecorMasterObjのバージョンによって変更されています。すなわち、Mac OS Xにおいてはメモリの問題を気にする必要はないため、直接ImageBinデータそのものが内部で処理されるように変更されています。また、当初は各アプリケーションに読み込まれたDecorMasterObjが設定内容を広域変数で保持していましたが、後のバージョンでは、広域変数の利用を排除してメモリーリークをなくし、より自由で安定したスクリプティングを実現するため、storeSet命令とloadSet命令は設定内容をテンポラリファイルに保存するように変更されています。各アプリケーションは、このようなDecorMasterObj内部の変更をほとんど意識する必要はありません。

ImageBinフォーマットの出力

リストでもレコードでも自由にバイナリファイルとして記録することができる Data Component Objectが作られ,その応用例として DecorChangerが作成されました。これに対応して DecorMasterにも DecorChanger書類をデータベースに読み込む機能が付きました。ImageBinフォーマットが単なるアプリケーション内部のデータの形式としてではなく、画像そのものと画像の表示方法を同時に定義したファイルフォーマットとなりました。ImageBinファイルフォーマットは内部にPICT、GIF、JPEGの画像を保持することができます。
画像と設定内容が一括してファイルに保存できる DecorChangerは Decorの取り扱いをずいぶんと簡単にしてくれました。それは DataCompObjの優れた機能のおかげでしたが, DataCompObjの側も, DecorChangerにおける使用を前提にパスワード保護やコピー防止保護などの機能を実現していきました。

データベースの近代化

データベースの実体はそもそもはDecorMasterObj内の属性として定義されたリストでした。そのため,以下のような問題がありました。
  1. DecorMasterからのDecorMasterObjの書き出しの際に,store命令を使用するため,しばしばシステムに不調を来していました。
  2. DecorMasterObj内にデータベースが存在することにより,データベース機能を利用するか否かに関わらずDecorMasterObjを利用するすべてのアプリケーションに大量のメモリを割り当てなくてはいけませんでした。
これらの問題を避けるため,DecorMasterObj 2.4以降ではデータベースが初期設定フォルダ内に Data Component Objectフォーマットとして保存されるようになりました。これにより,DecorMasterObjをコンパイルし直してもデータベースはそのまま利用することができるようになりました。また, CyberHandlerObjが画像の一時表示機能を利用する際にメモリ不足となることを防ぐため, DecorMasterObjはデータベースファイルの大きさと現在のアプリケーションのメモリの空きを比較できるようになりました。すなわち,データベース機能とデータベース本体が分離されたわけです。
DecorMasterObjと DecorMaster DataBaseが分離したことで,データベースの内容を操作するためのソフトウエアである DecorMasterは属性として DecorMasterObjを組み込んでおく必要がなくなりました。DecorMaster 2.4からは各ルーチンの内部で局所変数として DecorMasterObjを読み込むようになりました。ただし,この変更により DecorMaster 2.4は DecorMasterObj 2.4未満と互換性が失われました。 DecorMasterの変更に合わせて DecorChanger 1.5も実行エンジンである DecorMasterObjを共有ライブラリとして外部に持つようになりました。また,これらのソフトウエアは DataCompObjフォーマットで記録された DecorMasterObj共有ライブラリを利用することもできます。DecorChangerとその実行エンジンである DecorMasterObjの分離により,DecorMasterObjのアップデートのみで様々な画像表示環境に対応できる可能性が生まれ,後述するApple純正のデスクトップピクチャによる Decorのエミュレーション機能の開発につながっていきます。
storeSet/loadSet命令はデータをHDに書き出すのではなく広域変数として記憶していました。広域変数を保持した DecorMasterObjは CyberHandlerObjの内部において広域変数として保持されていました。しかし,広域変数のもたらすさまざまな弊害や仕様の不透明さが明らかになったため,CyberHandlerObjや DecorMasterObjから広域変数を排除することになりました。そこで storeSet/loadSet命令は文字通り画像表示に関する設定データをHDに保存することになりました。これは,どんなデータでもファイルに保存することができる DataCompObj共有ライブラリのおかげです。

Dialog Directorによる仮想データベース

Decorは漢字Talk7時代にはデスクトップへの画像表示として一般的なものでしたが,MacOS8にApple純正のデスクトップピクチャ機能が組み込まれたことによりあまり使われなくなりました。Decorがインストールされていない環境下でも,Dialog Directorがインストールされていることがあります。その場合,Dialog Directorを使って QuickDraw画像を Dialog Directorで表示することができます。ただしこの場合はデスクトップに画像を表示するのではなくウインドウを作成してそこに表示するので,dispImageルーチンではなくdispTempImageルーチンのみを使用します。あらかじめ画像の大きさに合わせてウインドウを作成しなければいけないので,あらかじめ作成しておいた画像を表示するだけの機能です。通常の DecorMasterObjのデータベースでは PICT/GIF/JPEGなどの画像を扱いますが,ここでは生のQuickDraw画像データを取り扱うので,データに関しても互換性がありません。実際には,AS RUnnerなど、CyberHandlerObjを親属性として持つアプリケーションの起動画面や警告画面などの表示に使われます。実際に CyberHandlerObjが呼び出す DecorMasterObjのルーチンは3つだけなので,そこに Dialog Directorの機能を組み込めばいいわけです。CyberHandlerObjを親属性として利用している各アプリケーションは、DecorMaster Obj内部のこのような変更を意識する必要はありません。これまでのDecorMasterObjとは違い、自由に操作できるデータベースが実在するわけではないので、これをDecorMasterObjの仮想データベースと呼びます。この機能に関して利用できるDecorMasterObjの命令とその動作内容は次のようになっています。
storeSet()
DD installを行う。
dispTempImage(ImageID)
対応するID番号を持ったQuickDraw画像を一時的に表示する。
loadSet()
画像を消去してDD uninstallする。
この機能においては画像を表示するスクリプトと画像データそのものは完全に一致しなくてはいけないため,DataCompObjを用いたネットワークインストーラにより一括してインストールが行われます。また,QuickDraw画像データのファイルへの保存もDataCompObjフォーマットが利用されています。
この Dialog Director用の仮想データベースモードとQuickDraw画像データの処理機能を備えた DecorMasterObjを DecorMasterObj ver.3.xと呼びます。そして,従来の Decor用の2.xと3.xの並行開発及び統合が目標となります。

Apple純正のデスクトップピクチャの登場

DecorMasterObj以外のスクリプトは単に DecorMasterObjのルーチンを呼び出しているだけだったのでデスクトップピクチャを制御する DecorMasterObjを開発すればよかったのですが,MacOS8のデスクトップピクチャコントロールパネルは現在表示中の画像のパスを得ることはできても表示に関する設定を得ることができず,完全な互換スクリプトを作成することはできませんでした。
MacOS 8.5からはデスクトップピクチャがアピアランスコントロールパネルに統合され,画像のパスだけではなく表示に関する設定やモニタの数なども AppleEventで取得することができるようになりました。設定できるモードの数が Decorよりもはるかに少ないため ImageBinフォーマットを完全に再現することはできませんが,ほぼ実用となる互換スクリプトを作成することができるようになりました。これが DecorMasterObj ver.3.5です。
Decorの制御には Decorの本体である Decor Daemonを直接スクリプト内で指定しなくてはいけないため,Decorがインストールされていない環境で DecorMasterObj ver.2.xを読み込むと「Decor Daemonはどこですか」と聞かれてしまいましたが, DecorMasterObj ver.3.xでは,Apple純正のデスクトップピクチャはクリエーターでアプリケーションを指定して AppleEventを直接スクリプトに記述することができるため,デスクトップピクチャが利用できない環境でも不具合は生じないので, DecorMasterObj ver.3.5以降はDecorMasterObjがネットワークインストーラの標準インストール項目となりました。

Decorのエミュレーション

DecorMasterObjは Apple純正のデスクトップピクチャ(以下DTPと略)を利用してDecorのエミュレーションを行います。DecorChangerや DecorMasterなどのアプリケーションは,Decor版のものをほぼそのまま使用しており,DecorMasterObjライブラリを環境に合わせて入れ替えるだけで漢字Talk7.5から Mac OS Xまで幅広く対応します。
Decorは次のような真偽値を持ち、それらの組み合わせにより多数の画像表示方法を利用できます。
scaling
画像を拡大縮小するかどうか。
keep proportions
画像の拡大縮小を行う場合に,縦横の比率を維持するかどうか。
scale down only
画像が画面より大きい場合に全体が入るように縮小するが,画像が画面より小さい場合に拡大はしない。
tiling
タイル表示をするかどうか。
scale and crop
画像が画面全体を覆うように拡大して,余った部分を切り捨てる。
それに対して,DTPは次のような4つのモードしかありません。
scaled
縦横の比率を維持したまま拡大縮小する。
filling
画面全体を覆うように拡大縮小する。
centerd
画面の中央に置く。
tiled
画像をそのままの大きさでタイル状に張る。
Decorのほうが圧倒的に細かく設定を行うことができるため,Decorのいくつかの設定はDTPでは正しく再現できません。たとえば,縦長の画像を縦横の比率を維持したまま拡大してタイル状に張るということはDecorならば簡単ですが,DTPでは不可能です。AppleにはもっとDTPの高性能化を要求したいものです。
しかし,DecorのパラメータをDTPで再現するために,可能な限りの再現を行うために,以下のようなロジックを組みました。

  1. もしもDecorで tiling:true ならば DTPでは tiled とする。
  2. もしもDecorで scaling:false ならば DTPでは centerd とする。
  3. もしもDecorで scaling:true かつ keep proportions:true ならば DTPでは scaled とする。
  4. もしもDecorで scaling:true かつ keep proportions:false ならば DTPでは filling とする。

これで,Decorのパラメータを使って DTPにおける画像表示が可能になりました。次に,DTPのパラメータから Decorのパラメータを生成してみましょう。そのためにはまず,Decorと DTPのパラメータの対応を見直してみましょう。

DTPtiling:scaling:keep proportions:
scaledfalsetruetrue
fillingfalsetruefalse
centerdfalsefalsetrue
tiledtruefalsetrue

この表をぐっとにらむと,scaledを標準としてそれ以外の場合にパラメータを修正すればいいということがわかります。
 set theSet to ¬
  {《class actv》:true, 《class achg》:false, 《class Itvl》:30, 《class pwId》:false, 《class pwIS》:10 ¬
     , 《class pick》:《constant ****arnd》, 《class scal》:true, 《class aspt》:true, 《class down》:true, 《class dthr》:true ¬
     , 《class cstm》:false, color:{65535, 65535, 65535}, 《class tile》:false, 《class crop》:false, 《class pVBL》:false ¬
     , 《class pErH》:《constant ****Eign》, 《class dpth》:《constant ****rlpc》, 《class ispc》:FilePath}
 if (version of AppleScript as real) > 1.3 then
  tell application getApp("apcp")
     if 《class dpos》 of 《class cmon》 1 is 《constant dposscal》 then set 《class down》 of theSet to false
     if 《class dpos》 of 《class cmon》 1 is 《constant dpostile》 then set 《class tile》 of theSet to true
     if 《class dpos》 of 《class cmon》 1 is 《constant dpostile》 then set 《class scal》 of theSet to false
     if 《class dpos》 of 《class cmon》 1 is 《constant dposfill》 then set 《class aspt》 of theSet to false
     if 《class dpos》 of 《class cmon》 1 is 《constant dposcntr》 then set 《class scal》 of theSet to false
     if 《class dpos》 of 《class cmon》 1 is 《constant dposauto》 then set 《class pwId》 of theSet to true --autoをwaitで代用
     quit
  end tell
 end if
これでDTPからDecorへの連携もOKです。本当は auto をどのように扱うかなどの問題がまだ残っているのですが,ここでは割愛します。DTPの持つモードは auto を除きすべてDecorでも使用できます。DecorChanger書類の規格をより詳細な設定が行えるDecorに合わせておいてよかったと思います。
あとは画像本体のデータと合わせて前述の ImageBinデータとし, DataCompObjフォーマットで丸ごと保存すると DecorChanger書類の出来上がりというわけです。
DecorMasterObj ver.3.5において dispTempImageルーチンはDTPによる Decorエミュレーションに割り当てられ,Dialog Directorによる仮想データベースは削除されましたが,DecorMasterObj ver.3.6以降は再び Dialog Directorによる仮想データベース機能も復活し,MacOS 8.5以降とそれ以前で自動的に両者が切り替わるようになりました。
Dialog Directorインストール下のMacOS 8.1では,同様の方法によりデスクトップピクチャコントロールパネルを使用した画像表示は行えますが,現在の画像の状態を取得することはできません。これにより storeSet/loadSet命令が動作しないため,CyberHandlerObjは dispTempImageルーチンを使用できません。DecorChanger等が DecorMasterObjに対して画像表示命令を出す場合は同じ dispTempImageルーチンであってもパラメータが ImageIDの整数ではなく ImageBinのリストなので,デスクトップピクチャコントロールパネルを使用した画像表示を行います。

ProgressBar と Speech Manager

開発用のコアライブラリであるCyberHandlerObjが肥大化して困っていたので,利用頻度の低かった Speech Managerに関するルーチンをDecorMasterObjに移動しました。

sVoice(text)
Speech Managerを利用します。対応する各種のosaxが必要です。

はるか以前の CyberHandlerObjには ProgressBarというヘルパーアプリケーションの制御機能がありましたが,ProgressBar Objectというライブラリに独立していました。このライブラリは利用頻度が低く、独立したファイルとしてインストールする必要性が低かったため、そのルーチン群は DecorMasterObjに組み込まれました。

startProgress(text)
ProgressBarを起動してプログレスバーを表示します。
setBar(integer),setMax(integer)
プログレスバーの最大値および現在の値を設定します。
setCap(text),setSubCap(text)
プログレスバーの表示文字列を変更します。
endProgress()
ProgressBarを終了します。

ProgressBar Object互換機能がDecorMasterObjに組み込まれた背景として,Dialog Director関連のルーチンが DecorMasterObj 3.xに数多く組み込まれており,次に述べる Dialog Directorによる ProgressBar Object互換機能を組み込むと DecorMasterObjに Dialog Director関連の機能を集約することができる点を上げることができます。
ProgressBar Object互換機能を持つのは DecorMasterObj 2.5以降および DecorMasterObj 3.0以降です。

Dialog Directorによる ProgressBar Object互換機能

現在ではProgressBarというヘルパーアプリケーションはほとんど用いられません。そこで,AppleScriptのユーザーの間で注目を集めている Dialog Directorを使用して同じ機能を実現してみました。

startProgress(text)
Dialog Directorをインストールしてプログレスバーを表示します。
setBar(integer),setMax(integer)
プログレスバーの最大値および現在の値を設定します。
setCap(text),setSubCap(text)
プログレスバーの表示文字列を変更します。
endProgress()
Dialog Directorをアンインストールします。

ルーチン名は ProgressBar用とまったく同じなので,スクリプトを組む際には ProgressBar用に組んでいるのか Dialog Director用に組んでいるのかを意識する必要は全くありません。DecroMasterObjは、ProgressBarや Dialog Directorのインストール状況を判断して適切な動作を行います。Dialog Directorを使用する際の DD instalなどの動作は自動的にルーチンの内部で行われます。
また,通常のMacintosh用ソフトウエアがしばしば利用する小さなダイアログを表示するためのルーチンもつけました。

startSmallProgress(text),endSmallProgress()
Dialog Directorにより小さなダイアログを表示します。


インストール条件

システムの環境とインストールされるDecorMasterObjの関係は以下のようになっています。

システム環境AppleScriptDecorMasterObjデータベース
MacOS 8.5/8.6/9.x1.3〜3.xDecorMaster DataBase
(CyberHandlerObjからの利用は不可)
MacOS 8/8.11.1.13.xDecorMaster DataBase
(CyberHandlerObjからの利用は不可)
Decor(任意)2.xDecorMaster DataBase
Dialog Director(任意)3.x仮想データベース
(内容の変更は不可,CyberHandlerObjから利用)
System7(任意)3.x利用不可

AppleScriptのバージョンが1.3以上であれば MacOS 8.5以上であると判断できるので, DecorMasterObj 3.xによりすべての機能が利用できます。それ以外の場合,Dialog Directorがインストールされていればほぼすべての機能が利用できますが,データベース機能は仮想データベースとなり,データベースの内容は変更できません。Decorがインストールされていれば DecorMasterObj 2.xとともにすべての機能が利用できます。MacOS 8/8.1であって,Dialog Directorと Decorのいずれもインストールされていない場合,DecorMasterObjは DecorMaster DataBaseの画像を表示できますが,元の画像に復旧する機能は使用できないため,CyberHandlerObjを通じての DecorMaster DataBaseの利用はできません。MacOS 7.6.1以前で Dialog Directorと Decorのいずれもインストールされていない場合,DecorMasterObjの機能はほとんど利用できないことになります。
Systemのバージョン及び Dialog Directorの有無はスクリプトで簡単に確認できますが,Decorの有無は簡単に確認できない上,Decor対応版の DecorMasterObj 2.xをシステムフォルダにインストールした状態で Decorがアンインストールされると CyberHandlerObjを利用したほとんどのスクリプトの動作に支障を来すため,DecorMasterObj 2.xはインストーラが別になっています。また,システムフォルダ内にインストールしなくてもよいように通常は対象となるアプリケーションとともに配布されます。ファイル名は2.xが「DecorMasterObj」,3.xが「DecorMasterObject」となっており,重複してインストールすることができます。複数のライブラリがインストールされている場合の読み込みの優先順位はスクリプト共有ライブラリ規格によって定義されています。
データベースは DecorMasterを使用すると新規に作成することができますが,登録ユーザーにはあらかじめ画像を記録したデータベースをインターフェース拡張ライブラリとして配布しています。ただし,Dialog Director用の仮想データベースのみは Dialog Directorがインストールされた条件下で AS Runnerに付属するネットワークインストーラからインストールできます。

アプリケーションと制御用のDecorMasterObjライブラリ,画面表示に使用されるシステムの関係は,次のようなレイヤー構造でとらえることができます。

アプリケーションDecorChanger
DecorMaster
AppleScript Runner
CyberHandlerObj
DecorMasterObj3.x2.x3.x
画像表示エンジンDesktop PictureDecorDialog Director
データベースDecorMaster Database仮想データベース
画像方式PICT・GIF・JPEGQuickDraw

Dialog Directorは QuickDrawデータを直接表示するのに対し, DecorMaster DatabaseではJPEGなどの画像ファイルを利用しているため,データベースが共有できていないことがわかります。

また,画像表示エンジンはアプリケーションとライブラリの組合せから次のようなマトリクスでとらえることもできます。

DecorMasterObj 2.xDecorMasterObject 3.x
AppleScript Runner
CyberHandlerObj
DecorDialog Director
DecorChanger
DecorMaster
DecorDesktop Picture

DecorMasterObjは親アプリケーションの種類やシステムの環境などの条件によってその振る舞いを変えますし,インストーラがインストールするファイルもさまざまです。


メモリ圧縮,マルチユーザー等への対応

DecorMasterObjバージョン2.6/3.7はメモリ圧縮技術である SHS Moduleに対応します。これは,DecorMaster DataBaseの読み書きをシステムヒープ上で行うことで,DecorMasterObjを利用するスクリプト,特に DecorMasterのメモリ割り当てを減らそうとする試みです。DecorMaster DataBase全体を読み込むためのメモリは必要なく,目的の画像を読み込むだけのメモリがあれば十分です。データベースファイルを読み書きするための汎用スクリプト SHS Moduleが同時に提供されます。
また,テンポラリファイルがテンポラリアイテムフォルダに,表示用画像データがデスクトップピクチャフォルダに作成されるようになりました。

DecorMasterObj 4.xにおける2.x系列と3.x系列の統合

MacOS9上でSHS Moduleによるメモリ圧縮が有効でないことが判明し,さらにマルチユーザーに関する問題が別の方法で解決可能であることがわかったため,バージョン2.6/3.7はいったん破棄されました。マルチユーザーに関する問題はMac OS 9 Support Plug-inというライブラリによって提供され、Mac OS 9においてのみネットワークインストーラからインストールされます。
また,Mac OS 9からはスクリプトアプリケーションが初期設定フォルダ内に新規ファイルを書き出すことができなくなったため DecorMaster DataBaseのネットワーク配信によるインストールが困難となり,この問題に対処するために DecorMaster DataBaseの保存先をアプリケーションと同じフォルダに変更しました。この変更は共有ライブラリである DecorMasterObjの変更によって行われ,アプリケーション DecorMasterは変更されていません。ただし,関連するドキュメント等を変更するために DecorMasterのパッケージは書き直されています。
これまでのバージョンでは,バージョン 2.xのファイル名がDecorMasterObj,バージョン 3.xのファイル名がDecorMasterObjectとなっていて,アプリケーションははじめにDecorMasterObjというファイルを探して,見つからなければDecorMasterObjectを探していました。MacOS8以降では原則としてDecorMasterObjectしか用いられませんし,Decorのインストールされていない環境下でDecorの制御用のコードを含むDecorMasterObj 2.xが読み込まれることはあまりよくない結果を生むことが多く,問題でした。
そこで,従来のDecorMasterObject 3.xの後続バージョンのファイル名をDecorMasterObjとし,従来のDecorMasterObj 2.xの機能(Decorの制御)を持つファイルをDecor Support Plug-inという名称にしました。これにより,どのような環境においてもアプリケーションが読み込むファイルはDecorMasterObjのみになりました。Decorの制御が必要な場合は,Decorがインストールされていることを確認した上でDecorMasterObjectがさらにDecor Support Plug-inを読み込むようになりました。さらに,アプリケーションが直接読み込むファイルがDecorMasterObjひとつに統一されるようになったため,従来のDecorMasterObjとDecorMasterObjectとで重複していたコードを大幅に削除できるようになりました。また、ネットワークインストーラは、Decorがインストールされていない環境下においてはDecor Support Plug-inそのものをインストールしません。
さらに,アプリケーション名にDecorを含まないアプリケーションに対してはdispTempImageルーチンは環境によらずDialog Director制御機能が提供されることになりました。CyberHandlerObjを親属性に持つアプリケーションからは,setMode(1),setMode(0)と順にコールするだけで、CyberHandlerObjがDecorMasterObjのstoreSet/dispTempImage/loadSet命令を順に適切なタイミングで呼び出し、そのアプリケーションにあった起動画面を表示することができるようになります。DecorMasterObjはアプリケーションの名称などの情報をスクリプト共有ライブラリ規格に沿って取得して起動画面を表示します。これにより,複数のアプリケーションに対して統一したブランドイメージを提供できます。
これらの変更を加えたバージョンをDecorMasterObj 4.0xといいます。ただし,DecorMaster,DecorChangerなどの一部のアプリケーションはシステムの環境を判定する際にDecorMasterObjのバージョンを利用し,DecorMasterObjのバージョン番号が3.0以上か未満かで動作内容がかわります。そのため,DecorMasterObjはアプリケーションの名称にDecorが含まれている場合には,システムがMacOS8以降であれば4.0x,それ以前であれば2.7xという偽りの数字を返します。DecorChangerなどからは,System7.x上ではDecorMasterObj 2.xを読み込んでいるように見えるため,DecorChangerはDesktop Picture制御モードではなくDecor制御モードで動作することになります。
このようにして,DecorMasterObj 4.0x/2.7xにおいては対応アプリケーションの側をほとんど書き換えることなく互換性と安定性の向上,スクリプトリソースの利用の効率化,各アプリケーションのブランドイメージの統一を実現しました。
DecorMasterObjectTitle Image

Ver.4.0

スクリプトアプリケーションに拡張されたユーザーインターフェースを提供します。

(C) Kazufumi SUZUKI

DecorMasterObj 4.0が提供するDialog Directorによる起動画面のイメージ(HTMLによる再現)

Mac OS Xへの対応

Mac OS X 10.1.2以降,AppleScriptからFinderを通じてデスクトップピクチャを変更することができるようになりました。また,shell scriptを通じてデスクトップの表示に関するパラメータを書き換えることができるようになりました。これらを利用することで,DecorMasterObj 5.xからMac OS Xにおいてデスクトップピクチャの表示の変更ができるようになりました。この機能はDecorMasterObj 5.0において実装されました。
ただし,この機能を持ったスクリプトをClassic Mac OSで読み込もうとするとアプリケーションがクラッシュすることがわかりました。そこで,Mac OS X用の機能を持ったDecorMasterObj 5.1は Mac OS X Support Plug-inと名称を変更し,各アプリケーションが直接読み込むファイルDecorMasterObjはOSのバージョンの判定と各OSに対応した適切なプラグインの読み込み機能を持つようにしました。それぞれのアプリケーションはこの変更を意識する必要はなく,実行の際にDecorMasterObjライブラリが必要な実行用スクリプトを探して実行するようにしました。
アプリケーション層DecorChanger, AS Runner
スクリプト共有ライブラリ層DecorMasterObj 4
実行スクリプト層Mac OS X Support Plug-in (DecorMasterObj 5)
デスクトップピクチャ表示層Mac OS X デスクトップピクチャ


変更履歴


c-open関連ページ
   スクリプトオブジェクト共有ライブラリ規格
   ネットワークインストーラ
   DecorMasterObject with MAGI Scheme
   DecorMaster
   DecorChanger
   CyberHandler Object
   Data Component Object
   エラー番号一覧


Copyright(C) Kazufumi SUZUKI, All rights reserved.