●逆襲のOS/2●(2006.05.11/2008.02.12)

壁紙チェンジャーの自作

●基本的な設定方法

OS/2では、REXXを使って壁紙を自動的に変更することが簡単にできる。たとえば、d:\os2\bitmap\mypic.bmpという画像ファイルを壁紙に設定するには、次のようなスクリプトを書けばよい。なお、画像ファイル名はフルパス必須。その次のパラメータの「N」は表示方法。「N」はノーマル、「T」はタイル。サイズ変更は…「S」かな?確認してない。末尾の三つの数字は背景色のRGB指定。「0 0 128」だと暗い青になる。
  CALL RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
  CALL SysLoadFuncs
  ……
  CALL SysSetObjectData '<WP_DESKTOP>', 'background=d:\os2\bitmap\mypic.bmp, N,,,0 0 128'
あとは、表示する画像ファイルをランダムに変更したり、一定時間毎に変更する機能などを追加すれば、立派な壁紙チェンジャーとなる。しかし、いくつかの厄介な題も残っている。

●デスクトップの実サイズと壁紙サイズ

OS/2の壁紙で一番厄介なのは、デスクトップの実サイズと壁紙サイズが一致しないことだ。つまり、1024×768の画面で1024×768の壁紙を使うと、画像全体が若干縮小されて左右にアキができてしまうか(通常イメージの場合)、縦方向にのみ若干圧縮されて表示されてしまう(サイズ変更イメージの場合)。この現象はWarpCenterを使用している場合に起きる。WarpCenterの高さ分だけデスクトップの実サイズが小さくなってしまい、壁紙もそれに合わせてリサイズされてしまうのである。いろいろ試してはみたが、画面サイズと壁紙サイズが同一の場合、壁紙を原寸で表示する方法はない。リサイズが掛かると見苦しくなる画像の場合、これはかなり深刻な問題だ。ちなみに、WarpCenterを「大」設定で使用している場合、XGAのデスクトップの実サイズは1024×743である(画面下部のスライダーの有無には無関係)。したがって、この環境で壁紙を原寸表示をするには、はじめから壁紙サイズを1024×743にしておく必要があるのだが、これは非常に面倒臭い上に、画像の汎用性がなくなる。

  lswitch(タスクバー・プログラム)を使う場合には、表示される領域はさらに狭くなる。WarpCenterと異なり、壁紙のサイズにまで影響を与えることはないが、lswitchの高さ分は隠れて見えなくなる。XGAの画面でWarpCenter(大)とlswitchを併用すると、実際に画面に表示される壁紙は縦715ドット分のみである。

●Jpegへの対応が不完全

OS/2の壁紙の二番目の問題は、Jpegに対応していない点だ。一応、Warp 4からはJpegにも対応したことになってはいるが、実際にはその対応は極めて不完全で、画像の一部が乱れたり、全然表示されないようなJpeg画像も存在する。さらに深刻なのは、単純に壁紙が表示されないだけではなく、PM全体が不安定になることがある点だ。Jpegの展開ルーチンにバグがあって、無限ループに陥ってしまっているようなカンジなのだ。したがって、Warp 4.xでも、実際にはBMPしか使えないと考える方がよい。とは言え、Jpegが使えないのは非常に不便な上、HDD容量を圧迫する原因にもなる。

●壁紙の変更が反映されない

壁紙のデータはメモリ上にコピーされる。デスクトップの再描画のたびに画像ファイルからデータを読み出してはたいへんなので、これは納得できる手法だ。おかげで、壁紙をいったん設定すれば、元の画像ファイルは消してしまっても影響はない(PMがクラッシュ→再起動するときは元の画像ファイルが必要)。その反面、ファイル名が同じだと、中身が書き変わっていても壁紙にまったく反映されない。自動的に変更されないのは当然としても、デスクトップのプロパティで壁紙を設定し直してもダメなのである。ファイル名が同じならば、中身は変わっていないと見做すようだ。これは、自動変更スクリプトを作る際に少々厄介な問題を引き起こした。

●サンプルスクリプト

以上の点を考慮して、壁紙のランダムチャンジャーを作ってみた。動作環境は、XGAでWarpCenterを「大」で使用している場合に限定した。スクリプトなので汎用性は持たせていないが、環境に合わせて書き換えるのは比較的楽だと思う。

基本的な特徴は次のようなもの;

【逆襲のOS/2目次】 【ホーム】